news 2026/5/13 15:16:13

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

作者头像

张小明

前端开发工程师

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/5/12 7:56:12

打卡信奥刷题(2534)用C++实现信奥 P2039 [AHOI2009] 跳棋

P2039 [AHOI2009] 跳棋 题目描述 在一个 111 行 NNN 列(NNN 是奇数)的棋盘上,有 KKK 个格子是红色的。这种情况下,你有一个跳棋在最左端的格子上。你的目标是将它移动到最右边的格子,在开始移动之间,你可以…

作者头像 李华
网站建设 2026/5/9 0:37:58

微服务链路追踪环境搭建终极指南:Docker一键部署全栈方案

微服务链路追踪环境搭建终极指南:Docker一键部署全栈方案 【免费下载链接】opentelemetry-collector OpenTelemetry Collector 项目地址: https://gitcode.com/GitHub_Trending/op/opentelemetry-collector 还在为分布式系统中的调用链追踪头疼吗&#xff1f…

作者头像 李华
网站建设 2026/5/11 12:05:37

Feather图标库完整使用指南:从入门到精通

Feather图标库完整使用指南:从入门到精通 【免费下载链接】feather 项目地址: https://gitcode.com/gh_mirrors/fea/feather 在开发现代Web应用时,图标的使用无处不在。你是否曾经遇到过这样的困扰:项目中的图标风格不统一、图标文件…

作者头像 李华
网站建设 2026/5/9 2:15:20

改善深层神经网络 第二周:优化算法(一)Mini-batch 梯度下降

1. Mini-batch 梯度下降法其实我们早就在使用这个方法了,现在来系统的阐述一下。如果你有些遗忘了梯度下降法本身的概念,可以回看之前的笔记:梯度下降法而发展出的随机梯度,Mini-batch 梯度,batch 梯度只是一次迭代中使…

作者头像 李华
网站建设 2026/5/9 0:38:11

AutoGPT事件驱动设计:通过消息队列实现松耦合

AutoGPT事件驱动设计:通过消息队列实现松耦合 在构建现代自主智能体的实践中,一个日益凸显的问题是:当LLM(大语言模型)开始承担复杂任务规划与执行控制时,传统的同步调用架构很快暴露出瓶颈。想象一下&…

作者头像 李华
网站建设 2026/5/13 3:38:35

C++ bitset类的使用与简介

有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供了bitset类使得处理位集合更容易一些。要使…

作者头像 李华