统一知识骨架
所有产品按相同的十二个公共维度讲解:定位、核心实体、路由分发、存储策略、生产确认、消费投递、顺序保证、失败处理、高可用架构、安全权限、性能瓶颈。
前 5 个为高频使用场景的代表性产品,其余 3 个可在导航栏「更多」下拉中查看。
| 产品 | 类型 | 核心价值 | 分卷文档 |
|---|---|---|---|
| RabbitMQ 🐰 | Queue | 灵活路由、可靠投递、延迟/优先级队列 | 8 页详解 → |
| Apache Kafka 🦓 | Log | 分区持久日志、高吞吐事件流、实时数据处理 | 8 页详解 → |
| RocketMQ 🚀 | Queue-Log | 事务消息、定时/延迟消息、金融级可靠性 | 8 页详解 → |
| Apache Pulsar 🦋 | Log-Cloud | 存算分离、多租户、云原生原生设计 | 8 页详解 → |
| Redis Streams 💾 | Stream | 内存高性能、简单 API、嵌入式事件总线 | 8 页详解 → |
包括 NATS JetStream、ActiveMQ Artemis、ActiveMQ Classic
投递语义、顺序保证、重试与 DLQ、延迟消息、回放保留、扩展复制、安全模型七大维度深度对比
回放 RabbitMQ、Kafka 与 Redis Streams 的已采集证据;页面不会启动 Broker,其他产品的本地实验见产品文档。
切换下面的模式,观察调用关系如何从「点对点强耦合」演化为「经 Broker 解耦」;点「播放消息流」可高亮一条消息的流转路径。
订单服务逐个直调下游:任一环节慢或挂,整条链路一起慢、一起挂。
模型细节与产品对照见消息模型。
七个产品在核心功能上的支持方式不同——「原生」不等于「免费」,「业务实现」也不等于「不可行」。
| 能力 | RabbitMQ | Kafka | RocketMQ | Pulsar | Redis Streams | NATS | Artemis |
|---|---|---|---|---|---|---|---|
| 端到端 exactly-once | 业务实现 | 仅集群内 EOS | 业务实现 | 业务实现 | 业务实现 | 业务实现 | 业务实现 |
| 顺序消息 | 单队列内 | 分区内 | MessageGroup 内 | 分区 + 订阅类型相关 | 单 Stream 内 | Subject/Stream 内 | 单队列内 + Message Group |
| 内置重试与 DLQ | 组合配置(TTL+DLX) | 业务实现 | 原生(Broker 内置) | 组合配置(DeadLetterPolicy) | 业务实现(PEL+XCLAIM) | 组合配置(AckWait+MaxDeliver) | 原生(address-setting) |
| 延迟消息 | 组合配置(TTL+DLX) | 业务实现 | 原生(定时投递) | 业务实现 | 不适用 | 原生(JetStream 延迟投递) | 原生(_AMQ_SCHED_DELAY) |
| 消息回放 | 不适用(ACK 即删) | 原生(位点/时间戳) | 原生(位点重置) | 原生(reset-cursor) | 原生(XRANGE/XGROUP SETID) | Core 不适用;JetStream 原生 | 不适用(ack 即删) |
选型没有万能冠军:按输入维度筛选候选,见 选型指南。
git clone https://github.com/xy2401/hello-mq.git && cd hello-mq
npm install
# 运行单个实验
bash demos/rabbitmq/basic/run.sh # 启动 RabbitMQ,发 3 条、收 3 条并校验
# 运行全部实验
for s in demos/*/*/run.sh; do bash "$s"; done # 15 个实验全跑一遍环境要求与完整说明见实验约定。
适合目标读者:需要深入理解消息系统底层原理、构建高可靠分布式系统的后端工程师与 SRE。
本页结论:异步消息解决的是解耦、削峰与最终一致性三类问题,代价是引入投递不确定性,需要显式的可靠性设计。
继续增加同步 RPC 无法解决以下问题:
生产者把消息交给 Broker 后即可返回;Broker 承担保管与转发职责;消费者按自己的能力处理。这是从“同步调用链”到“事件驱动协作”的本质变化。
引入消息系统的最小代价清单:
bash demos/rabbitmq/basic/run.sh # 观察生产确认、投递、消费确认三个独立状态本页为产品无关的原理性内容,不依赖特定产品版本;各产品差异见对应分卷与官方资料基线。
本页结论:队列、发布订阅、分区日志、请求响应四种模型解决不同问题;选型第一步是确定需要的模型,而不是挑选产品。
下面提供可切换的交互拓扑:选择模型查看参与方与消息流向,点「播放消息流」高亮一条消息的路径(静态示意,不连接真实 Broker)。
一条消息只被组内一个消费者处理;消费者越多,处理能力越强(RabbitMQ Queue / Kafka 同组消费者 / Pulsar Shared)。
一条消息只被组内一个消费者处理,消费者水平扩展处理能力。
典型场景:任务分发、订单处理。关键语义:分发公平性、预取(Prefetch)、单条消息只成功处理一次(配合确认)。
一条消息被每个订阅各投递一次;订阅内部可以再竞争消费。
典型场景:事件广播。关键语义:每个订阅独立维护消费位置;新增订阅通常只能消费其建立之后的消息(日志型系统可回放除外)。
消息追加写入分区,消费不删除数据,按游标(Offset/Cursor)推进,可任意回放。
典型场景:事件溯源、审计流、流处理上游。关键语义:分区内有序、消费组再均衡、保留期与回放。
借助消息通道完成一问一答,通常有临时回复队列或关联 ID。适合需要跨进程调用但不想直连的场景;不适合要求严格低延迟的同步调用。
bash demos/rabbitmq/basic/run.sh # 竞争消费:发 3 收 3,单队列单消费者
bash demos/rabbitmq/routing/run.sh # 三个独立订阅(队列)对同一交换机的不同路由模型定义为中性描述;产品映射见 RabbitMQ 概念映射 与统一术语表。
本页结论:at-most-once / at-least-once / exactly-once 描述的是“哪一段链路”的保证;生产确认与消费确认是两段独立的确认,任何“不丢”结论都必须附带前置条件与故障窗口。
| 语义 | 含义 | 代价 |
|---|---|---|
| at-most-once(至多一次) | 不重投;发送或处理失败时消息可能丢失 | 最低延迟,可能丢消息 |
| at-least-once(至少一次) | 不丢失;失败时重投,业务必须预期重复 | 需要幂等消费或去重 |
| exactly-once(恰好一次) | 效果上每条消息只被应用一次 | 仅覆盖特定边界,见下 |
每项“保证”必须拆开看:
| 层级 | 要回答的问题 |
|---|---|
| Broker 层 | 什么条件下接受、持久化、复制或重投消息?(确认级别、副本条件、队列持久化) |
| Client 层 | SDK 超时、重试、ACK、Offset 提交如何配置?超时后重试可能造成重复 |
| Business 层 | 数据库写入与外部副作用如何保持一致?Outbox + 幂等消费 |
幂等表(processed_messages 唯一键)是这个窗口的唯一防线——详见 RabbitMQ 可靠性。
bash demos/rabbitmq/consumer-crash/run.sh # 重投发生且被幂等拦截:duplicatesObserved=1, duplicatesApplied=0各产品的确认机制与配置见 RabbitMQ 可靠性;官方来源见官方资料基线(checkedAt: 2026-08-19)。
本页结论:消息系统只承诺“某个范围内”的顺序(分区/队列/Key/单消费者);全局顺序代价极高,失败重试必然与顺序冲突。
| 层级 | 含义 | 代价 |
|---|---|---|
| 全局顺序(Total Order) | 所有消息按发送顺序被所有消费者看到 | 只能单队列/单分区/单消费者,吞吐受限 |
| 队列/分区内顺序 | 同一队列或分区内按写入顺序消费 | 需要把相关消息路由到同一单元 |
| Key 顺序 | 同一业务 Key(如 orderId)的消息有序 | 由路由/分区键保证,跨 Key 无序 |
| 单消费者顺序 | 单个消费者按接收顺序处理 | 并发处理即失效 |
把需要有序的消息映射到同一顺序单元,是顺序设计的通用做法:
prefetch=1 才能得到处理顺序;多消费者竞争消费时处理顺序不保证。顺序消费中一条消息失败会阻塞后续消息(头阻塞,Head-of-line Blocking)。两种取舍:
prefetch/拉取批量为 1 或串行提交。bash demos/rabbitmq/retry-dlq/run.sh # 观察失败消息旁路对正常消息进度的影响中性定义见统一术语表;Kafka/Pulsar 的分区顺序细节在其分卷落地(Phase 2/3)。
本页结论:“消费”是否删除数据是队列模型与日志模型的根本分野;回放能力由保留策略决定,消费位点是回放的操纵杆。
| 模型 | 消费后数据 | 回放 | 代表 |
|---|---|---|---|
| 队列模型(消费即删) | 确认后删除 | 有限(依赖 TTL/DLX 等旁路) | RabbitMQ Classic Queue、RocketMQ |
| 日志模型(消费不删) | 按保留策略清理 | 保留期内任意位置回放 | Kafka、Pulsar、Redis Streams |
retention.ms)。bash demos/rabbitmq/basic/run.sh # 队列模型:消费确认后队列深度归零,无回放入口Kafka/Pulsar 的回放实验在 Phase 2/3 落地。
保留与压缩语义以各产品官方文档为准(官方资料基线,checkedAt: 2026-08-19)。
本页结论:积压(Backlog)是“生产速率 > 消费能力”的信号;先定位成因(生产突增 / 消费变慢 / 消费者离线 / 分区不均 / 毒消息循环 / Broker 限流),再决定扩容、限流还是隔离。
| 模型 | 积压指标 |
|---|---|
| 队列型 | Queue Depth(ready + unacked)、最老消息年龄 |
| 日志型 | Consumer Lag(最新位点 − 消费位点)、各分区 lag 分布 |
| Redis Streams | Stream 长度 + Pending Entries List(PEL)数量与滞留时长 |
| Pulsar | Subscription Backlog |
辅助指标:消费速率、处理延迟 P95、重投递率、DLQ 增量、Broker 磁盘/内存水位。
bash demos/rabbitmq/retry-dlq/run.sh # 毒消息循环的识别与隔离积压-恢复实验(消费者离线后追赶)在后续版本补充。
各产品的流控与积压观测命令见产品分卷运维页(当前:RabbitMQ 运维与观测)。