gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:25:29 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com