news 2026/10/9 7:52:45

从同步耦合到异步解耦:消息中间件如何重塑系统间的通信范式?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从同步耦合到异步解耦:消息中间件如何重塑系统间的通信范式?

当成百上千的服务需要相互协作时,它们之间的通信模式变得至关重要。如果服务间采用紧密耦合的同步调用,一个服务的延迟或故障,就可能引发连锁反应,导致系统性的“雪崩”。

消息中间件正是为了打破这种刚性依赖而生。它在服务之间建立了一个异步的通信渠道,通常是一个消息队列。生产者服务只需将任务(即“消息”)投递到队列中便可完成工作,而无需等待消费者服务的实时响应。

使用场景

消息中间件常见的使用场景,包括不限于解耦、有序性、异步处理、削峰填谷等。

解耦

在一个电商系统中,用户下单后,订单系统通常需要直接调用库存系统来减少库存。但是,如果库存系统有问题或延迟,订单系统也会受影响,导致用户下单失败或延迟。

使用消息中间件,订单系统在用户下单后只需发送一条消息,然后立即回应用户。库存系统会从消息中间件获取消息并处理。这样,即使库存系统有问题,订单系统也不会受影响。

image

有序性

在一个银行系统中,用户的转账操作可以被视为一个消息,包含转账金额和目标账户。这些消息的顺序很重要,因为需要保证转账的顺序与用户的操作顺序相同。

使用消息中间件,可以把每次转账操作作为一个消息发送出去。消息中间件能确保消息的顺序,也就是先发送的消息先处理,后发送的消息后处理。这样,用户的转账操作顺序就能得到保证。

image

异步处理

在一个在线服务平台中,用户登录后,系统需要做一些操作,如更新登录时间,发送欢迎邮件,生成登录日志等。如果这些操作同时进行,可能会让用户等待时间变长,影响体验。

使用消息中间件,用户登录成功后,系统可以立即回应用户,然后把需要做的操作作为消息发送出去。后台服务会从消息中间件获取消息,然后异步处理。

image

削峰填谷

在一个电商网站的大促销活动中,用户访问和订单量会激增,这就是"流量峰值"。如果系统直接处理这些请求,可能会因负载过大而崩溃,所以需要"削峰",即平滑处理这些请求。

使用消息中间件,用户下单时,系统可以将订单作为消息发送出去,然后立即回应用户。后台服务会从消息中间件获取消息,然后处理订单。这样,即使短时间内订单量大,也不会直接冲击到订单处理服务,实现了"削峰"。

另外,在流量低的时候,如深夜,订单处理服务可能会闲置。这时,如果有未处理的订单在消息中间件中,订单处理服务可以继续处理订单,实现了"填谷"。

架构

image

无论是Kafka系统架构,还是RocketMQ系统架构,从图中可以看到它们整体的结构是大同小异的,通常由四个主要部分构成。

1)生产者:负责生成并发送消息到Broker集群进行存储。

2)Broker集群:这是消息队列的核心部分,它负责存储来自生产者的消息,并将这些消息分发给消费者进行处理。

3)消费者:负责接收并处理来自Broker集群的消息。

4)元数据中心集群:例如Kafka中的Zookeeper和RocketMQ中的NameServer,它们都扮演着相似的角色,主要负责维护集群以及主题相关的元数据。

image

集群扩展能力

Kafka和RocketMQ都具有良好的集群扩展能力,但它们的实现方式和特点有所不同。

!image

在Kafka中,数据同步以分区为单位进行。在创建主题时,会预设分区数和副本数。Kafka会从每个分区的副本集中选出一个Broker作为Leader,其余副本所在的Broker则作为Follower。所有客户端请求(包括生产者发送消息和消费者消费消息)都由Leader节点处理,数据同步也由Leader节点向Follower节点进行。这种设计赋予了Kafka优秀的水平扩展性,可以通过增加Broker数量来提升集群的存储和处理能力。

在RocketMQ中,整个集群由多个子集群组成,每个子集群包含一个Master节点和多个Slave节点。RocketMQ会首先按照子集群对主题进行分片,然后在每个子集群内部将分片的主题进一步拆分为多个消息队列(MessageQueue)。每个消息队列是一个逻辑队列。当生产者发送特定主题的消息时,通过负载均衡策略(默认为轮询策略)将消息路由到各个消息队列,从而确保集群中每个Broker节点的负载大致均衡。

主题

在消息中间件中,主题(Topic)是一个关键的逻辑概念。生产者将消息发布到特定的主题,而消费者则从这些主题中订阅并接收消息。因此,主题实际上是消息的分类标识,它使得消费者能够进行有效的消息筛选和选择。

主题的存在实现了一条消息可以被多个消费者接收,从而形成了一种发布-订阅(Pub-Sub)的通信模式。例如,在一个“天气更新”主题中,所有订阅了这个主题的消费者(可能包括多个应用或服务)都会收到关于天气更新的消息。

这种模式的优势在于它实现了生产者和消费者的解耦。生产者只需知道消息应发送到哪个主题,而无需关心谁将会是消费者。同样,消费者只需订阅他们感兴趣的主题,而无需知道谁是消息的生产者。这种解耦的设计,使得生产者和消费者可以独立地进行扩展和修改。

image

未完待续

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 21:23:41

5分钟掌握UpSetR:超越维恩图的集合交集可视化神器

5分钟掌握UpSetR:超越维恩图的集合交集可视化神器 【免费下载链接】UpSetR An R implementation of the UpSet set visualization technique published by Lex, Gehlenborg, et al.. 项目地址: https://gitcode.com/gh_mirrors/up/UpSetR UpSetR是一个强大的…

作者头像 李华
网站建设 2026/10/8 16:10:43

机构洗盘拼合指标绝无未来 源码分析

{}VAR01:LLV(L,10); VAR02:HHV(H,25); 趋势线:EMA((C-VAR01)/(VAR02-VAR01)*4,4); 价:EMA(MA((((C-REF(C,1))(H-REF(H,1))(L-REF(L,1)))/3)/C,5),1); 价5:MA(价,5); 量:EMA(MA((V-REF(V,1))/V,5),1); 量5:MA(量,5); 角:1>(ATAN((C/REF(C,1)-1)*100)*180/3.14115926)>-1; …

作者头像 李华
网站建设 2026/10/9 10:40:31

Android项目架构完整指南:模块化开发与Kotlin最佳实践

Android项目架构完整指南:模块化开发与Kotlin最佳实践 【免费下载链接】android-showcase igorwojda/android-showcase: 是一个用于展示 Android 开发技巧和最佳实践的项目集合,包括了多种 Android 开发工具和技巧,可以用于学习 Android 开发…

作者头像 李华
网站建设 2026/10/8 21:12:31

Horovod Process Sets:让千亿参数模型训练触手可及

Horovod Process Sets:让千亿参数模型训练触手可及 【免费下载链接】horovod Distributed training framework for TensorFlow, Keras, PyTorch, and Apache MXNet. 项目地址: https://gitcode.com/gh_mirrors/ho/horovod 你是否曾经因为GPU显存不足而放弃训…

作者头像 李华
网站建设 2026/10/8 19:04:00

5步掌握Loco+Tauri:构建高性能跨平台桌面应用的终极指南

5步掌握LocoTauri:构建高性能跨平台桌面应用的终极指南 【免费下载链接】loco 🚂 🦀 The one-person framework for Rust for side-projects and startups 项目地址: https://gitcode.com/GitHub_Trending/lo/loco 还在为桌面应用开发…

作者头像 李华
网站建设 2026/10/8 10:05:37

如何在Zephyr RTOS中制定最佳编译策略?

如何在Zephyr RTOS中制定最佳编译策略? 【免费下载链接】zephyr Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures. 项目地址: https://gitcode.com/GitHub_T…

作者头像 李华