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

时间:2019-03-11 08:22:33

标签: spring performance spring-boot rocketmq

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

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

但是我不确定我做的是否正确,有人可以来帮助我检查我当前的方法是否合理,或者在我的方法中带来任何潜在的风险。

我正在做的是:

  1. 服务A在其控制器中接收请求,然后将其异步写入RocketMQ。 RocketMQ用于削峰。

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

  3. 服务C启动一个守护程序线程,以检查Redis中的消息号。如果缓存列表大小达到某个值,它将拉出所有消息并将其保存到MySQL中,然后在Redis中刷新缓存。

3 个答案:

答案 0 :(得分:4)

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

事实

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

建议

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

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

服务B和C也可以轻松扩展。评估服务B和服务C的功能是否可以在单个服务中合并。除了将B放到Redis中之外,它还可以将其存储在MySQL中。这取决于您需要多少碎片,以及如何管理碎片带来的额外复杂性。 B将对发布的内容做出反应,而服务C似乎一直在为条目数量集中Redis缓存(这可以通过键空间通知来解决)。

从Redis读取数据时,请小心,将其存储为MySQL并刷新它。当或如果使用一个Redis密钥对写入其中的所有服务实例使用Redis密钥,则可以轻松地丢失或刷新未存储在MySQL中的某些数据。

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

答案 1 :(得分:2)

我可以将您的问题分为两个子主题。

  

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

为了使您的应用程序更能响应传入的请求,您需要

  • 减少请求处理时间
  • 垂直或水平扩展系统

如果考虑第一种方法,则可以简单地引入功能更强大的硬件,优化传输级别协议的使用或简单地删除不必要的处理步骤(例如:您可以像消息代理一样简单地引入Kafka并可靠地持久化,而不是使用步骤B和C消息。因此您可以删除Redis依赖项

为了优化系统中的网络控制和协议使用,请参阅High Performance Browser Networking书。

要进行扩展,只需考虑负载即可使用Docker swarm或Kubernetes。最重要的是,您可以简化应用程序内的依赖关系,以获得更好的性能和易于处理。

答案 2 :(得分:0)

高缩放比例与要处理的负载非常相关:

但是您可以使用此事件总线模式处理多个请求:

1)服务A:将消息发布到事件总线(主题/交换)
2)Broker(ActiveMq / RabbitMq / etc。):将这些消息转发到队列。
3)服务B:从队列中侦听并更新MySQL中的记录。

下游服务(服务B)的多个实例将按需提供可伸缩性(如果负载更多,则部署更多实例,如果负载更少,则部署更少实例)。

enter image description here