在Java中开发高度可伸缩的web应用程序需要做什么?

在Java中开发高度可伸缩的web应用程序需要做什么?,java,Java,我想从与大规模生产系统打过交道的经验丰富的Java专业人员那里了解一下,要将web应用程序构建到每天可以处理1000多万个请求的规模,需要做些什么 例如,如果需要进行某种缓存,那么使用什么产品质量库进行缓存?最重要的是,应用程序应该具有一定的可预测性。至于“如何”,如果没有对需求和体系结构进行更深入的分析,这是不可能的。缓存通常是某种形式的关键组件。根据几个因素,例如数据的波动性和变化率,可以采取不同的方法。最简单的方法是只使用本地缓存,记住对缓存数据所做的更改不会立即反映在所有节点上,除非添加

我想从与大规模生产系统打过交道的经验丰富的Java专业人员那里了解一下,要将web应用程序构建到每天可以处理1000多万个请求的规模,需要做些什么


例如,如果需要进行某种缓存,那么使用什么产品质量库进行缓存?

最重要的是,应用程序应该具有一定的可预测性。至于“如何”,如果没有对需求和体系结构进行更深入的分析,这是不可能的。缓存通常是某种形式的关键组件。根据几个因素,例如数据的波动性和变化率,可以采取不同的方法。最简单的方法是只使用本地缓存,记住对缓存数据所做的更改不会立即反映在所有节点上,除非添加一些缓存同步。另一方面,您拥有完全分布式的缓存,如Terracotta BigMemory或其他分布式/集群缓存解决方案


我建议您尽早建立性能测试基线。这将允许您测试正在开发的系统的可伸缩性。针对一个、两个、三个etc负载平衡节点运行基准测试,并测量吞吐量。还要确定所有节点之间必须共享的任何资源或数据,以及如何正确地同步这些资源或数据以实现最佳可伸缩性。

很难将编写和维护大规模应用程序所获得的信息浓缩成论坛帖子形式的答案。通常,人们会花很多钱给其他有这种专长的人

您需要了解应用程序的概念。一些陷阱在分析阶段会出现,特别是在基础设施方面(在哪里为什么服务?),其他陷阱则是通过数据处理(同步将如何工作?)

其他的将在稍后出现,如“X崩溃时我们将做什么”(插入X基础设施的任何部分)。您可以根据这些场景检查并重新检查恢复时间

然后你写下整个想法的各个部分,测试失败场景和用例


最后,如果你认为所有的事情都考虑过了,你把它交给一个和你一样有经验的人,也许更多,然后写下他们认为是问题的所有事情,测试他们的投诉,并改变应用程序和/或基础设施的结构,以适应所有用例。

这是一个庞大的主题,不容易回答-一般来说,非常大规模的应用程序需要针对预期处理的特定负载进行仔细设计

例如:如果您的体系结构主要处理只读页面视图(通过复制大量廉价的应用程序服务器很容易扩展),那么您的体系结构将与处理复杂金融事务(您需要一种协调大量同时事务的方法)的体系结构大不相同

一些一般提示:

  • 更喜欢水平缩放-您希望尽可能通过添加更多便宜的盒子来实现可伸缩性。您可以设计越多的应用程序以适应此模型,效果就越好
  • 对可变状态的协调更改最终将成为您可扩展性的瓶颈,因为这是一件不能用廉价盒子水平扩展到您喜欢的程度的事情。计算出这些变化是什么,并据此进行设计。如果幸运的话,一个数据库实例就足够了。如果不是这样,您将进入非常昂贵的数据库集群/在NoSQL/高度定制的数据存储区域上分层事务语义
  • 使用经验证的可扩展库/组件。e、 g.用于高吞吐量通信
  • 在没有团队专业知识的情况下不要尝试此操作-将应用程序扩展到“大联盟”是很困难的,需要专业技能。如果你做错了,你可能会陷入瓶颈,需要昂贵的重写。雇佣以前做过的人
顺便说一句,每天1000万个请求实际上并没有那么大。也就是说,每秒只有115个请求。通过合理严密的编码,一台现代化的服务器可以处理……

关于这个主题的书有很多。多本书。所以这个问题对于这个格式来说可能太宽泛了。