Spring Boot 应用程序可以处理大量请求

标签 spring performance spring-boot rocketmq

我正在使用 Spring-boot 或 Spring-Cloud Framework 开发 Web 应用程序。 系统主要用于处理来自客户端的 HTTP Restful 请求,然后保存到 MySQL 数据库中。

但我计划使其更具可扩展性。它应该能够启动每个服务的更多实例,并使系统可以处理更多的传入请求。

但我不确定我的做法是否正确,谁能来帮我检查一下我目前的做法是否合理,或在我的做法中引发任何潜在风险。

我正在做的是:

  1. Service A 在其 Controller 中接收请求,然后将请求异步写入 RocketMQ。 RocketMQ 用于削峰。

  2. 然后Service B订阅Service A写入的RocketMQ主题,并将消息以list的形式缓存到Redis中。

  3. 服务 C 启动一个守护线程检查 Redis 中的消息编号。如果缓存列表大小达到一定值,就会拉取所有消息并保存到 MySQL 中,然后刷新 Redis 中的缓存。

最佳答案

与往常一样,一个问题可以有更多的解决方案。以下建议基于我作为软件架构师的日常工作和经验。

事实

您的系统由三个(微)服务(A、B 和 C)、消息代理 (RocketMQ)、缓存 (Redis) 和数据库 (MySQL) 组成。在评论中,您还提到您计划在 F5 硬件和 Docker 上运行它。

建议

服务 A 在前端公开以处理 HTTP 请求。异步处理用于管理负载,但是效率仍然受限于服务 A 的性能。因此服务 A 应该是可扩展的以实现更高的吞吐量。必须评估单个单元的性能(查看性能测试、压力测试......)以确定扩展。

要启用 Docker 容器的自动扩展,您需要编排工具(例如 Kubernetes),它会根据配置的指标扩展您的系统。还要考虑扩展系统可以使用的系统资源。

服务 B 和 C 也可以轻松扩展。评估是否可以将服务 B 和服务 C 的功能加入到单个服务中。除了 B 将新数据放入 Redis 之外,它还可以将其存储在 MySQL 中。这取决于您需要多少碎片以及如何管理碎片带来的额外复杂性。 B 已经对发布的内容使用react,而服务 C 似乎不断地汇集 Redis 缓存以获取条目数(这可以通过键空间通知来解决)。

从 Redis 读取数据、将其存储到 MySQL 并刷新时要小心。当您对写入其中的所有服务实例使用一个 Redis key 时,您很容易遗漏或刷新一些未存储在 MySQL 中的数据。

在处理异步处理时,您通常会处理最终一致性,这意味着服务 A 处理的数据将无法立即用于其他可能想要从 MySQL 读取数据的服务(只是一个想法对于更广泛的情况,重要性因情况而异。

关于Spring Boot 应用程序可以处理大量请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55097754/

相关文章:

java - 除了一个子包,我如何在整个包上应用 aop

java - Spring 连接的 EhCache 磁盘存储在多线程应用程序中创建冲突

java - 如何在 JdbcTemplate 中执行多批删除?

ios - 在场景的 update() 之外更新 SKNodes

java - kubernetes 中 Pod 之间基于 Cookie 的 session 持久性

java - 改进 GoogleAppEngine Spring Web 应用程序启动时间

android - 我可以使用 Glide 来缓存图像而不显示它们吗

c - 找出最少 3 个数字的最快方法?

java - @Autowired 依赖注入(inject)在 junit 测试中没有发生

java - 组合@PathVariable和@RequestBody