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

How do I scale a Java app with a REST API and a Database?

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

但是客户的数量在增长,我觉得有必要

这是我现在的图表(Java 应用程序和数据库都在同一台服务器上):

缩放这个的 best/correct 方法是什么?

谢谢!

网络服务器:

运行 您的应用在多个服务器上,在负载均衡器后面。使用 AWS Elastic Beanstalk 或使用 EC2 + Autoscaling Groups + ELB 推出您自己的解决方案。

您提到了对负载均衡器 "flooding" 的担忧,但如果您使用 Amazon 的弹性负载均衡器服务,它会自动扩展以处理您获得的任何流量,因此您无需担心这个关注。

数据库服务器:

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

如果您还没有开始在 Redis 中缓存您的数据库查询。有一些插件可以很容易地用 Hibernate 做到这一点。如果您的应用程序定期执行相同的查询,这将减轻您的数据库服务器的巨大负载。将 AWS ElastiCache 或 RedisLabs 用于您的 Redis 服务器。

图片:

停止在网络服务器上存储图像文件!这会产生很多可扩展性问题。将它们移至 S3 并直接从 S3 提供服务。 S3 为您提供无限存储 space、自动备份以及直接从 S3 提供图像的能力,从而减少您的网络服务器上的负载。

部署:

这里有太多的解决方案,以至于人们更喜欢哪种方法就成了一个问题。如果您使用 Elastic Beanstalk,那么它会提供部署解决方案。如果您不使用 EB,那么有数百种解决方案可供选择。我建议先设计您的环境,然后选择适合您设计的环境的自动化部署解决方案。

备份:

如果你做对了,你的网络服务器上就不会有太多的备份。使用 Elastic Beanstalk,为了重建您的 Web 服务器,您所需要的只是您签入 Git 的代码和配置文件。如果您最终不得不备份 EC2 服务器,您将需要查看 EBS 快照。

对于数据库备份,RDS 会自动执行每日备份。如果您想要在 RDS 之外进行备份,您可以使用 pg_dump 和 cron 作业自行安排这些备份。

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

CDN:

你没有提到这个,但你应该看看 CDN。这将使您的应用程序得到更快的服务,同时减少服务器上的负载。 AWS 提供了 CloudFront CDN,我也推荐看看 CloudFlare。