我正在使用Spring-boot或Spring-Cloud Framework开发Web应用程序。 该系统将主要用于处理来自客户端的HTTP Restful请求,然后将其保存到MySQL数据库中。
但是我计划使其更具扩展性。它应该能够启动每个服务的更多实例,并使系统可以处理更多传入请求。
但是我不确定我做的是否正确,有人可以来帮助我检查我当前的方法是否合理,或者在我的方法中带来任何潜在的风险。
我正在做的是:
服务A在其控制器中接收请求,然后将其异步写入RocketMQ。 RocketMQ用于削峰。
服务B然后订阅RocketMQ主题,服务A以list的格式写入到Redis并将消息缓存到Redis中。
服务C启动一个守护程序线程,以检查Redis中的消息号。如果缓存列表大小达到某个值,它将拉出所有消息并将其保存到MySQL中,然后在Redis中刷新缓存。
答案 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)