如何使用REST API和数据库扩展Java应用程序?

Ped*_*roD 3 java cloud distributed-computing amazon-s3 amazon-web-services

我有一个典型的无状态Java应用程序,它提供REST API并在Postgresql数据库中执行更新(CRUD).

然而,客户的数量正在增长,我觉得有必要

  • 增加冗余,以便如果一个失败则发生另一个
  • 为此,我可能需要一个负载均衡器?
  • 通过不淹没网络和一台服务器的CPU来提高响应速度(但负载均衡器将如何不被淹没?)
  • 也许我需要分发数据库?
  • 我希望能够无缝更新我的应用程序(我已经看到了一个名为kubernetes的东西):逐个杀死每个冗余节点并立即用更新版本替换它
  • 我的应用程序还存储了一些图像文件,这些文件在磁盘大小上快速增长,我需要能够分发它们
  • 所有这一切都必须是可备份的

这是我现在拥有的图表(Java app和DB都在同一台服务器上):

在此输入图像描述

缩放这个的最佳/正确方法是什么?

谢谢!

Mar*_*k B 6

Web服务器:

在负载均衡器后面的多个服务器上运行您的应用程序.使用AWS Elastic Beanstalk或使用EC2 + Autoscaling Groups + ELB滚动您自己的解决方案.

您提到了对负载均衡器"泛滥"的担忧,但如果您使用亚马逊的Elastic Load Balancer服务,它将自动扩展以处理您获得的任何流量,这样您就不必担心这种担忧.

数据库服务器

将数据库移动到RDS并启用多重故障转移.这将创建一个热备用服务器,如果主服务器出现问题,数据库将自动进行故障转移.(可选)添加只读副本以扩展数据库容量.

如果您尚未在Redis中开始缓存数据库查询.有很多插件可以很容易地使用Hibernate来做到这一点.如果您的应用定期执行相同的查询,则会对数据库服务器造成巨大负担.将AWS ElastiCache或RedisLabs用于Redis服务器.

图片:

停止在Web服务器上存储图像文件!这产生了许多可伸缩性问题.将它们移到S3并直接从S3提供它们.S3为您提供无限的存储空间,自动备份以及直接从S3提供映像的能力,从而减少Web服务器的负载.

部署:

这里有很多解决方案,它只是一个人们喜欢哪种方法的问题.如果您使用Elastic Beanstalk,那么它为部署提供了解决方案.如果您不使用EB,那么有数百种解决方案可供选择.我建议首先设计您的环境,然后选择适合您所设计环境的自动部署解决方案.

备份:

如果您这样做,您的Web服务器上应该没有多少备份.使用Elastic Beanstalk,为了重建Web服务器,您需要的只是您已检入Git的代码和配置文件.如果您最终必须备份EC2服务器,则需要查看EBS快照.

对于数据库备份,RDS将自动执行每日备份.如果您希望在RDS之外进行备份,可以使用pg_dump和cron作业自行安排.

对于映像,您可以启用S3版本控制和多区域复制.

CDN:

你没有提到这一点,但你应该看一下CDN.这样可以更快地提供应用程序,同时减少服务器的负载.AWS提供CloudFront CDN,我还建议您查看CloudFlare.