MQ全家桶实战【第一章:MQ零基础入门专题·第5节】主流 MQ 家族大阅兵(RabbitMQ/Kafka/RocketMQ/ActiveMQ/Pulsar/NATS/ZeroMQ 谁主沉浮?)
🏆 本文收录于 《SpringBoot + MQ全家桶实战》 专栏。
专栏围绕 Spring Boot 环境下主流消息中间件的 集成、原理、实战、选型与架构设计 展开,覆盖 RabbitMQ、Kafka、RocketMQ、Pulsar、NATS、ZeroMQ 等常见消息技术栈,持续更新中,欢迎订阅学习。如果你正在经历这些问题:消息丢失、重复消费、消息堆积、延迟消息不会设计、削峰填谷不会落地、分布式事务不会处理、MQ 选型总是拿不准,那么这套专栏就是为你准备的。
本专栏不是零散的 API 教程,而是一套真正面向 企业实战、架构设计、生产可用、面试进阶 的 MQ 系统化学习路线。我们会从 基础概念 → Spring Boot 集成 → 可靠性保障 → 高并发优化 → 生产环境治理 → 选型方法论 逐步展开,帮助你把 MQ 从“会用”提升到“会设计、会排障、会讲清楚”。
📌专栏持续更新中,后续还会不断补充更多实战案例、性能调优、故障排查、源码分析、面试高频题解析与项目落地方案。
一次订阅,持续学习,后续更新内容无需重复付费,适合长期收藏与系统进阶。
本专栏导读介绍,请往这里走:《SpringBoot + MQ全家桶实战》专栏导读!欢迎前往阅读打卡~
全文目录:
-
- 一、为什么这一节是“分水岭”?
- 二、先给结论:不是“选最强”,而是“选最合适”
- 三、先看全景图:七位选手的气质差异
- 四、从架构视角理解 MQ 家族的分化
- 五、七大 MQ 的定位与边界
- 六、把“谁主沉浮”拆成 8 个工程维度
- 七、适用场景:把选型说透
- 八、一张真正有用的选型矩阵
- 九、Spring Boot 3 视角下,为什么要重新理解这些 MQ?
- 十、一个很重要的现实:很多团队不是在“选 MQ”,而是在“接历史包袱”
- 十一、对比式理解:为什么它们看起来都像 MQ,实际上却不是同一种东西
- 十二、给 Spring Boot 3 开发者的选型建议
- 十三、代码预热:先给你一个统一的“消息抽象”思路
- 十四、RabbitMQ / Kafka / RocketMQ 的最小化对比代码
- 十五、为什么这一节不建议一上来就深入源码?
- 十六、本节小结:谁主沉浮?
- 十七、下期预告
- 参考式理解清单
- 🧧 学习福利 · 限时开放 🧧
- 🫵 Who am I?
一、为什么这一节是“分水岭”?
如果说前面 4 节内容是在帮你建立 MQ 的“语义认知”,那么这一节就是把认知落到“工程现实”。因为真正走进业务之后,你会发现:
- 有的系统更像“事务型通信”,强调可靠投递、确认、重试、死信、顺序和延迟;
- 有的系统更像“数据管道”,强调吞吐、分区、复制、保留和回放;
- 有的系统更像“轻量级消息总线”,强调低延迟、简单、请求-响应和云原生;
- 还有一些系统严格来说并不是传统意义上的“消息中间件”,而是消息库、通信库或协议兼容层。
因此,“谁主沉浮”并不是在问谁绝对更强,而是在问:在不同的业务场景下,谁更合适。
这一节会把常见 MQ 家族放在同一张桌子上,帮助你形成一套真正可落地的选型方法。
二、先给结论:不是“选最强”,而是“选最合适”
我先定个调:
- RabbitMQ 适合“业务消息调度”与“灵活路由”;
- Kafka 适合“海量事件流”和“日志型数据管道”;
- RocketMQ 适合“企业级业务消息”与“金融级可靠投递”;
- ActiveMQ 适合“JMS 兼容”和“存量系统对接”;
- Pulsar 适合“云原生多租户”和“存算分离”;
- NATS 适合“超轻量低延迟”和“服务间通信”;
- ZeroMQ 更像“嵌入式消息通信库”,适合把网络编排能力直接带进应用进程。
这不是口号,而是由它们的架构目标决定的。
三、先看全景图:七位选手的气质差异
如上图,帮助大家建立第一层认知:它们不是同一类“同质产品”,而是面向不同工程目标的不同答案。
四、从架构视角理解 MQ 家族的分化
4.1 传统消息 broker 型
典型代表:RabbitMQ、ActiveMQ、RocketMQ。
特点是:
- 以 Broker 为核心;
- 提供消息投递、确认、重试、死信、持久化、路由等能力;
- 更贴近“业务消息”语义;
- 对开发者来说,最容易把“某个业务动作”抽象为“发送一条消息”。
4.2 事件流平台型
典型代表:Kafka、Pulsar。
特点是:
- 以“日志/流”为核心抽象;
- 更关注吞吐、分区、存储、回放、扩展性;
- 消费者通常按 offset 或订阅位置消费;
- 更适合构建数据管道、流处理、事件驱动架构。
4.3 轻量通信与消息库型
典型代表:NATS、ZeroMQ。
特点是:
- 强调极低延迟、简洁和高效;
- 可能不依赖传统意义上的复杂 Broker 体系;
- 更适合云原生微服务之间的实时通信、边缘系统、内网高频消息交换;
- ZeroMQ 甚至更像一种嵌入式通信库,而不是“现成消息平台”。
五、七大 MQ 的定位与边界
5.1 RabbitMQ:业务消息路由的优等生
RabbitMQ 官方将其定位为“enterprise grade open source messaging and streaming broker”,即企业级开源消息与流式 broker。它的核心特征是基于 AMQP 生态,路由模型成熟,exchange / binding / queue 的组合非常灵活,适合把复杂业务拆成可控的消息路由图。
它的气质是:
- 擅长业务侧消息路由;
- 擅长灵活投递;
- 擅长可视化管理和运维;
- 更适合“消息驱动业务编排”。
5.2 Kafka:事件流与数据管道之王
Kafka 官方明确把自己定义为分布式事件流平台,既能 publish/subscribe,也能持久化存储和处理流数据;其介绍页强调它被广泛用于高性能数据管道、流式分析、数据集成和关键任务应用。
Kafka 的气质是:
- 吞吐优先;
- 存储优先;
- 回放优先;
- 更适合日志型、事件型、分析型系统。
5.3 RocketMQ:企业级业务消息的实战派
RocketMQ 官方当前定位为云原生“messaging, eventing, streaming”实时数据处理平台,强调云原生、高吞吐和面向企业业务场景的可靠投递能力。官方文档还明确给出了与 ActiveMQ、Kafka 的比较,并在 5.x 客户端 SDK 文档中持续强调演进与最佳实践。
RocketMQ 的气质是:
- 业务消息能力很强;
- 顺序、延迟、事务等能力是其传统优势;
- 在国内互联网和企业业务系统中存在感很高。
5.4 ActiveMQ:JMS 时代的经典代表
ActiveMQ Classic 官方将其定义为最流行的开源、多协议、基于 Java 的消息 broker,并明确指出它支持 AMQP、MQTT、STOMP、OpenWire 等协议。其 Classic 文档还说明它是 JMS 1.1 的开源实现。
ActiveMQ 的气质是:
- 兼容性很强;
- JMS 存量系统接入方便;
- 适合老系统、Java 体系、协议兼容需求较多的场景。
5.5 Pulsar:面向云原生的“消息 + 流”平台
Apache Pulsar 官方将其定位为云端构建的开源分布式消息与流平台,并强调其 layered architecture、横向扩展能力和多集群特性;官网还把它描述为 all-in-one messaging and streaming platform。
Pulsar 的气质是:
- 适合云原生部署;
- 更关注存算分离和多租户;
- 面向大规模平台化使用场景。
5.6 NATS:轻量级、高性能、云原生通信底座
NATS 官方把自己定义为简单、安全、高性能的开源数据层/消息系统,支持 pub/sub、request/reply 和 JetStream 持久化。其官方文档也强调它是面向现代分布式系统、微服务和云原生架构的连接技术。
NATS 的气质是:
- 极致轻量;
- 低延迟;
- 很适合服务调用、事件广播与边缘通信;
- JetStream 补足了持久化和回放能力。
5.7 ZeroMQ:更像“消息通信编程库”而不是传统 Broker
ZeroMQ 官方将其描述为高性能异步消息库,能提供 sockets 形式的消息通信,并且“可以在没有专门 broker 的情况下运行”。这意味着它的定位和传统 MQ 有本质差异。
ZeroMQ 的气质是:
- 极简;
- 极快;
- 架构灵活但需要开发者自己承担更多通信治理;
- 更适合在你已经具备强工程能力时,按需搭建消息网络。
六、把“谁主沉浮”拆成 8 个工程维度
这一部分是本节最重要的知识点。不要只看官网口号,要看工程真相。
6.1 吞吐量
- Kafka:天生为高吞吐、顺序追加、批量读写而设计,适合海量事件流。
- Pulsar:也非常强,尤其在云原生与横向扩展上更有特点。
- RocketMQ:业务消息场景吞吐很能打。
- RabbitMQ:吞吐通常不是第一卖点,但在业务消息和灵活路由上表现均衡。
- NATS / ZeroMQ:低延迟感知更强,但它们解决的问题和 Kafka 不同。
6.2 延迟
- NATS 通常是极低延迟的优先选项,官方强调 sub-millisecond latency。
- ZeroMQ 以轻量通信库方式提供极低开销。
- RabbitMQ / RocketMQ / ActiveMQ 更强调业务可靠性与功能完整性,延迟通常不是唯一指标。
6.3 消息语义
- RabbitMQ:交换机、路由键、绑定关系清晰,天然适合复杂路由。
- Kafka:核心是 topic + partition + offset,消费逻辑偏“日志读取”。
- RocketMQ:更偏业务消息体系,围绕消息队列、tag、key 等进行组织。
- NATS:以 subject 为基础的兴趣订阅模型,天然简单。
- ZeroMQ:pattern 驱动,开发者对模式控制更强。
6.4 持久化与回放
- Kafka:最强的典型之一,核心就是可持久化的事件日志。
- Pulsar:同样强调持久化、消费确认和流式能力。
- NATS JetStream:提供存储和回放能力,补齐核心 NATS 的短板。
- RabbitMQ / ActiveMQ / RocketMQ:都支持持久化,但更偏“消息可靠投递”而不是“无限回放日志”。
6.5 路由能力
- RabbitMQ:路由最灵活,exchange 类型组合是它的招牌。
- RocketMQ:在业务消息维度也很强,特别适合标签、顺序、延迟等业务控制。
- NATS:subject 订阅简单直接,适合轻量化路由。
- Kafka:路由主要通过 topic 和分区策略完成,不追求复杂表达式路由。
6.6 运维复杂度
- RabbitMQ:上手友好,运维相对直观。
- Kafka:强大但运维门槛较高,尤其在分区、ISR、副本、堆积和容量规划上。
- Pulsar:架构更现代,但整体系统组件更多,学习曲线也更陡。
- ZeroMQ:没有中心 Broker 但并不等于“更简单”,因为连接拓扑和治理需要自己设计。
6.7 协议兼容
- ActiveMQ 在协议兼容上很强,官方明确支持 AMQP、MQTT、STOMP、OpenWire 等。
- RabbitMQ 的 AMQP 生态非常经典。
- Kafka / Pulsar / NATS 更多是各自体系下的客户端协议和原生 API 生态。
6.8 云原生适配
- Pulsar、NATS、RocketMQ 5.x 都明显强调云原生方向。
- Kafka 也已经是云基础设施的常客,但其核心思维仍偏事件流平台。
- RabbitMQ / ActiveMQ 在传统企业系统中依然非常成熟。
七、适用场景:把选型说透
7.1 选 RabbitMQ 的典型场景
适合:
- 订单创建后通知库存、积分、营销、物流;
- 复杂路由需求,比如不同会员等级、不同业务线、不同标签投递;
- 业务团队更看重“可靠投递 + 灵活路由 + 易运维”;
- 需要通过 AMQP 生态快速落地。
不太适合:
- 超大规模事件流平台;
- 极强回放与流式分析场景。
7.2 选 Kafka 的典型场景
适合:
- 埋点、日志、监控、行为数据采集;
- 数据管道、ETL、实时计算;
- 事件溯源、事件驱动架构中的核心事件总线;
- 需要保留历史消息并支持回放。
不太适合:
- 复杂业务路由和多条件分发;
- 对“单条消息业务语义”要求特别丰富的场景。
7.3 选 RocketMQ 的典型场景
适合:
- 电商订单、支付、库存、营销等业务链路;
- 需要顺序消息、延迟消息、事务消息;
- 对业务消息可靠性、可运维性、企业场景适配度要求高;
- 国内 Java 技术栈团队希望快速落地成熟方案。
7.4 选 ActiveMQ 的典型场景
适合:
- 老系统升级;
- JMS 体系;
- 多协议接入需求较多;
- 需要对接 Java 生态中历史悠久的消息实现。
7.5 选 Pulsar 的典型场景
适合:
- 多租户平台;
- 云原生消息平台;
- 业务量大、节点多、需要灵活扩展;
- 希望统一消息与流处理平台。
7.6 选 NATS 的典型场景
适合:
- 微服务之间超低延迟通信;
- request/reply 风格 RPC 替代或补充;
- 云原生控制面;
- 边缘计算、IoT、实时通知。
7.7 选 ZeroMQ 的典型场景
适合:
- 希望在应用层直接构建通信模式;
- 追求极致性能;
- 团队有较强架构与网络编程能力;
- 不依赖完整的 Broker 平台,而是做定制化消息编排。
八、一张真正有用的选型矩阵
| 维度 | RabbitMQ | Kafka | RocketMQ | ActiveMQ | Pulsar | NATS | ZeroMQ |
|---|---|---|---|---|---|---|---|
| 核心定位 | 业务消息 Broker | 事件流平台 | 企业级业务消息 | JMS/多协议 Broker | 云原生消息流平台 | 轻量消息系统 | 嵌入式消息库 |
| 吞吐 | 中高 | 很高 | 高 | 中 | 很高 | 高 | 很高 |
| 延迟 | 中低 | 中 | 中低 | 中 | 低 | 很低 | 很低 |
| 路由灵活度 | 很高 | 中 | 高 | 高 | 中 | 中 | 高(但需自定义) |
| 回放能力 | 中 | 很强 | 中 | 中 | 很强 | 通过 JetStream 增强 | 需自己设计 |
| 协议兼容 | AMQP 生态强 | 原生生态 | 原生生态 | 很强 | 原生生态 | 原生生态 | socket 风格 |
| 运维门槛 | 低中 | 中高 | 中 | 中 | 中高 | 低中 | 低“平台依赖”,高“设计依赖” |
| Spring Boot 友好度 | 很高 | 很高 | 很高 | 中 | 中 | 中 | 较弱 |
这张表不是“绝对排名”,而是“工程偏好图”。
九、Spring Boot 3 视角下,为什么要重新理解这些 MQ?
Spring Boot 3 带来的变化,不只是版本号,而是工程底座的现代化:
- 基于 Jakarta EE 命名空间迁移;
- 更贴近 Java 17 及以上版本;
- 自动配置、健康检查、指标、AOT / 原生编译生态更加成熟;
- 与 Observability、Micrometer、Actuator 的结合更顺滑。
这意味着你在 3.x 体系里做 MQ 集成时,关注点已经不只是“能连上”,而是:
- 能否与 Actuator、指标、链路追踪协同工作;
- 能否适配容器化与云原生部署;
- 能否在配置层面、连接层面、序列化层面形成统一规范;
- 能否为后续多 MQ 混搭打下扩展点。
这也是为什么本专栏不会只讲“一个 RabbitTemplate 怎么发消息”,而是要从“家族选型”讲起。
十、一个很重要的现实:很多团队不是在“选 MQ”,而是在“接历史包袱”
在真实项目里,你经常遇到这些情况:
- 老项目已经在用 ActiveMQ,新的微服务只是在上面继续扩展;
- 公司统一标准是 RabbitMQ,但数据平台另起 Kafka;
- 国内核心交易链路用 RocketMQ,而埋点和日志却交给 Kafka;
- 新平台在云原生环境下选择 NATS 或 Pulsar,老系统逐步迁移;
- 某些高性能模块直接用 ZeroMQ 在进程间/服务间做定制通信。
所以,架构师真正要做的不是“一刀切”,而是:
- 识别业务边界;
- 识别团队能力;
- 识别运维能力;
- 识别未来演进方向;
- 识别是否存在历史兼容成本。
十一、对比式理解:为什么它们看起来都像 MQ,实际上却不是同一种东西
11.1 RabbitMQ vs Kafka
RabbitMQ 更像“智能分发中心”,Kafka 更像“事件日志系统”。
如果你需要“把一条订单消息准确送到库存、风控、营销三个不同队列”,RabbitMQ 很顺手;
如果你需要“把订单事件长期保留,多个系统按各自进度读取,并支持重放”,Kafka 更合理。
11.2 RocketMQ vs RabbitMQ
RocketMQ 与 RabbitMQ 都很适合业务消息,但 RocketMQ 在顺序、延迟、事务等方面更偏业务实战,而 RabbitMQ 的交换机模型更灵活。
11.3 Pulsar vs Kafka
两者都强调流式能力,但 Pulsar 的 layered architecture 和多集群特征让它在云原生与多租户方向更有表达力;Kafka 依然是事实上的事件流基础设施巨头。
11.4 NATS vs ZeroMQ
NATS 是完整的消息系统,ZeroMQ 更像消息通信库。NATS 可以直接拿来作为服务通信底座,ZeroMQ 则更像把消息模式嵌入你的程序设计。
11.5 ActiveMQ vs 其他现代 MQ
ActiveMQ 的价值并不在“最潮”,而在“兼容”和“存量”。如果你的系统强依赖 JMS、AMQP、MQTT 或老 Java 生态,ActiveMQ 的现实意义依然很大。
十二、给 Spring Boot 3 开发者的选型建议
12.1 新手优先顺序
如果你是 Spring Boot 3 + Java 17+ 的开发者,建议优先顺序如下:
- RabbitMQ:最适合建立 MQ 的基础认知;
- Kafka:帮助你理解事件流、分区与回放;
- RocketMQ:帮助你深入业务消息与企业级功能;
- NATS / Pulsar:了解云原生与轻量通信的新趋势;
- ActiveMQ:掌握存量系统接入;
- ZeroMQ:理解“消息库”与“消息平台”的边界。
12.2 实战优先级
- 业务系统:RabbitMQ / RocketMQ
- 数据平台:Kafka / Pulsar
- 微服务边缘通信:NATS
- 存量兼容:ActiveMQ
- 极致性能定制:ZeroMQ
十三、代码预热:先给你一个统一的“消息抽象”思路
这一节虽然是“家族大阅兵”,但为了不让知识停留在口号,我们先看一个非常实用的抽象思想:把消息发送行为抽象成统一接口,再针对不同 MQ 做适配。
public interface DomainEventPublisher {
// 发送领域事件
void publish(String topic, String payload);
}
后面你可以针对 RabbitMQ、Kafka、RocketMQ 分别实现不同的适配器。这样做的好处是:
- 业务层不关心 MQ 细节;
- 后续切换 MQ 成本更低;
- 便于测试和扩展。
这一招在 Spring Boot 3 项目里非常实用,因为你可以把 MQ 能力沉到基础设施层,把业务代码保持得更纯净。
十四、RabbitMQ / Kafka / RocketMQ 的最小化对比代码
下面给出的是“同一业务事件”在三种 MQ 里的典型表达方式。它们不是完整工程,但结构是可落地的。
14.1 RabbitMQ:面向路由的事件发送
@Service
public class OrderEventRabbitPublisher {
private final RabbitTemplate rabbitTemplate;
public OrderEventRabbitPublisher(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public void publishOrderCreated(String orderId) {
// 使用 direct exchange 按 routing key 精准路由
rabbitTemplate.convertAndSend(
"order.direct.exchange",
"order.created",
orderId
);
}
}
@Component
@RabbitListener(queues = "order.created.queue")
public class OrderCreatedRabbitConsumer {
@RabbitHandler
public void onMessage(String orderId) {
// 中文注释:这里处理订单创建后的后续动作
System.out.println("收到订单创建消息: " + orderId);
}
}
14.2 Kafka:面向事件流的发布
@Service
public class OrderEventKafkaPublisher {
private final KafkaTemplate<String, String> kafkaTemplate;
public OrderEventKafkaPublisher(KafkaTemplate<String, String> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void publishOrderCreated(String orderId) {
// 中文注释:发送到 Kafka topic,key 可用于分区路由
kafkaTemplate.send("order-created-topic", orderId, orderId);
}
}
@Component
public class OrderCreatedKafkaConsumer {
@KafkaListener(topics = "order-created-topic", groupId = "order-service")
public void onMessage(String orderId) {
// 中文注释:消费订单创建事件
System.out.println("Kafka 收到订单创建消息: " + orderId);
}
}
14.3 RocketMQ:面向业务消息的发布
@Service
public class OrderEventRocketMqPublisher {
private final RocketMQTemplate rocketMQTemplate;
public OrderEventRocketMqPublisher(RocketMQTemplate rocketMQTemplate) {
this.rocketMQTemplate = rocketMQTemplate;
}
public void publishOrderCreated(String orderId) {
// 中文注释:发送到 RocketMQ 主题
rocketMQTemplate.convertAndSend("order-topic", orderId);
}
}
@Component
@RocketMQMessageListener(
topic = "order-topic",
consumerGroup = "order-consumer-group"
)
public class OrderCreatedRocketMqConsumer implements RocketMQListener<String> {
@Override
public void onMessage(String orderId) {
// 中文注释:处理订单创建消息
System.out.println("RocketMQ 收到订单创建消息: " + orderId);
}
}
提示:这些代码是用于理解“同一业务在不同 MQ 的表达方式”的最小样例。真正项目里还需要配套配置类、序列化策略、重试策略、幂等控制、死信处理等能力。
十五、为什么这一节不建议一上来就深入源码?
很多文章写 MQ,喜欢第一屏就讲底层存储、网络模型、分区算法、刷盘机制。但对刚入门的读者来说,这样会导致两个问题:
- 看不懂;
- 看懂了也不知道在哪用。
正确方式应该是:
- 先建立“家族地图”;
- 再建立“选型认知”;
- 再进入“运行模型”;
- 最后才是“源码与调优”。
这也是本专栏的写法:先认知,再工程,再源码。
十六、本节小结:谁主沉浮?
如果只给一句最实用的结论:
- RabbitMQ:更像业务路由大师;
- Kafka:更像数据流基础设施;
- RocketMQ:更像业务消息实战派;
- ActiveMQ:更像 JMS 与老系统的桥梁;
- Pulsar:更像云原生时代的平台型答案;
- NATS:更像轻量、低延迟的服务通信底座;
- ZeroMQ:更像消息通信的编程工具箱。
真正的“主沉浮”,不是谁名字更响,而是谁更适合你的业务、团队和演进路线。
十七、下期预告
下一节我们将进入:第6节:消息协议全景图(AMQP / MQTT / STOMP / JMS 协议深度对比)。
到那一节,你会真正理解:
- 为什么 RabbitMQ 和 AMQP 常常一起出现;
- 为什么 ActiveMQ 和 JMS 经常绑在一起;
- 为什么协议层的差异,会直接影响 Spring Boot 集成方式;
- 为什么一个团队会在“消息系统”与“消息协议”之间做不同层次的选型。
参考式理解清单
- 想做“业务投递”与“路由控制”,优先看 RabbitMQ、RocketMQ;
- 想做“事件流”与“数据管道”,优先看 Kafka、Pulsar;
- 想做“超低延迟服务通信”,优先看 NATS;
- 想做“存量 JMS 兼容”,优先看 ActiveMQ;
- 想做“极致定制”,再看 ZeroMQ。
本节到这里,已经从“家族认知”过渡到了“工程选型”。下一节开始,我们将把这些家族背后的协议层彻底拆开。
…
ok,本节课就上到这里,下课~
🧧 学习福利 · 限时开放 🧧
这套《SpringBoot + MQ全家桶实战》专栏,真正想带给你的,不只是“会发消息、会收消息”,而是一整套可以迁移到真实项目里的 消息驱动架构思维。
当你把这套内容学完,你会明显发现自己看系统的方式变了:
你不再只关心“这条消息怎么发出去”,而是会开始思考:
- 这条消息该不该发?
- 发到哪一种 MQ 更合适?
- 如何保证消息不丢、不重、不过期?
- 消费失败后怎么兜底?
- 如何支撑高并发场景?
- 如何设计可观测、可恢复、可扩展的消息系统?
这,才是 MQ 真正的进阶之路。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注技术号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G PDF编程电子书、简历模板、技术文章Markdown文档等海量资料。
ps:本文涉及所有源代码,均已上传至Gitee开源,供同学们直接对照学习 Gitee传送门,同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗
🫵 Who am I?
我是 bug菌:
- 活跃于 CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等技术社区;
- CSDN 博客之星 Top30、华为云多年度十佳博主&卓越贡献奖、掘金多年度人气作者 Top40;
- 掘金、InfoQ、51CTO 等平台签约及优质作者;
- 全网粉丝累计 30w+。
更多高质量技术内容及成长资料,可查看这个合集入口 👉 点击查看 👈
硬核技术号 「猿圈奇妙屋」 期待你的加入,一起进阶、一起打怪升级。💪
- End -
更多推荐




所有评论(0)