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

时间:2011-10-10 07:40:15

标签: java

我想知道从事过大规模生产系统的经验丰富的Java专业人员,需要做些什么来构建可以每天处理1000万多个请求的Web应用程序?

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

3 个答案:

答案 0 :(得分:4)

这是一个很大的主题,不容易回答 - 一般来说,非常大规模的应用程序需要仔细设计,以满足他们预期要处理的特定类型的负载。

例如:如果它处理大多数只读页面视图(通过复制大量廉价应用程序服务器容易扩展),那么您的架构将会非常不同,如果它处理复杂的金融交易(您需要一种方式)协调大量的同步交易。)

一些一般提示:

  • 首选水平扩展 - 您希望尽可能通过添加更便宜的方框来实现可扩展性。您可以设计的应用程序越多,就越适合这个模型。
  • 对可变状态进行协调更改最终将成为您可扩展性的瓶颈,因为它是您无法根据自己喜欢的水平方式扩展到便宜盒子的一件事。弄清楚这些变化将是什么,并进行相应的设计。如果幸运的话,单个数据库实例就足够了。如果没有,您将进入NoSQL /高度自定义数据存储领域的非常昂贵的数据库集群/分层事务语义。
  • 使用可扩展的经过验证的库/组件。例如Netty用于高吞吐量通信。
  • 如果没有团队专业知识,请不要尝试 - 将应用程序扩展到“大联盟”很难,需要专业技能。如果你做错了,你可能会遇到需要昂贵重写的瓶颈。聘请以前做过的人。
顺便说一句 - 每天1000万个请求实际上并不是那么大。这只是每秒115个请求。通过合理紧密的编码,一个现代服务器可以处理......

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

很难将通过编写和维护大规模应用程序而获得的内容压缩成以论坛帖子形式出现的答案。通常,人们会向拥有这种专业知识的其他人支付很多钱。

您需要了解应用程序的概念。一些陷阱在分析阶段变得更加流行,特别是关于基础设施(什么服务在什么地方?),其他陷阱通过数据处理(同步将如何工作?)。

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

然后你写出整个想法的部分内容并测试失败场景并使用案例。

最后,如果你认为所有事情都被想到了,你就把它交给像你一样经验丰富的人,甚至更多,然后写下他们认为是问题的一切,测试他们的抱怨并改变他们的结构。应用程序和/或基础设施,以适应所有用例。