如何处理高流量Java Web应用程序中的负载?

时间:2012-02-21 02:28:43

标签: java-ee architecture load high-traffic

我正在开发一个高流量的Java Web应用程序。目前我正在定义它的架构。我有一些问题:

  • 在设计处理负载的架构时,我们应该考虑哪些关键要素?
  • 如何防止Web应用程序出现故障或如何确保高可用性?

我希望一次有数百名用户登录。我打算将数据保存在应用程序范围(静态变量)中,以避免在数据库中进行查找。在会议中,我计划存储5kB的数据。

3 个答案:

答案 0 :(得分:1)

我想我会考虑的关键因素是:

  • 您是否需要支持群集的应用服务器?
  • 您是否需要基于硬件或软件的负载均衡器?
  • 您将记录哪些参数来确定服务器的运行状况?
  • 您是否会对数据库进行负载均衡?
  • 你的应用程序是I / O重吗? CPU重吗?既?
  • 您是否希望利用大量网络流量?如果您为每个用户平均提供5K数据,那么在考虑链接饱和之前,您能够处理多少用户?
  • 向上扩展与向外扩展。确定您的应用最适合哪一个并利用它。
  • 会有很多数据库交易吗?
  • 您将使用共享存储吗?

我希望这会有所帮助。

答案 1 :(得分:0)

可伸缩性对于预期处理不断增长的流量的系统非常重要。无国籍对于实施简易规模系统非常重要。 Checkout http://www.playframework.org/,一个无状态的Web框架。将playframework与mongodb一起使用(通过PlayMorphia模块),您可以轻松实现可扩展的Web应用程序。

答案 2 :(得分:0)

我的一些考虑因素和最佳做法:

  • 使用SOLID原则,并非全部都适用于所有项目,尤其是单一职责和开放/封闭原则,可帮助您更轻松地扩展/定制软件,以应对不断变化的需求和不断增长的流量
  • 保留很少更改内存数据库中的配置数据,如果需要更改,请先更新关系数据库并调用Restfull API刷新内存对象
  • 通过估计产品增长来更快地运行搜索查询,从而为大数据定义和划分逻辑。例如如果移动电话号码是通过模运算通过考虑关系数据库或内存数据库中单个db对象大小约束来确定分区ID的关键值,则
  • 通过序列化更新操作,使数据库更新至少保持在同一行上。如果要在短时间内更新数据状态,请将其保存在内存中,并使用计划的任务对关系数据库进行批量更新。
  • 充分利用可用的日志记录库来记录重要内容 并且有意义,更喜欢异步日志记录。
  • 通过单独的队列进行历史记录记录,使用批处理插入并通过计划的作业使用它
  • 考虑使用异步API逻辑来加快执行速度,当并行作业执行完成时,应期望具有会话ID或返回跟踪ID的请求来请求并发送响应。
  • 向消费者端点的通知失败的实施重试逻辑
  • 独立且自给自足地定义每个软件子系统。子系统应该通过API而不是通过共享内存或磁盘存储来通信和共享数据。