TL;DR
- 场景: 写/读 RocketMQ 文档与代码时,概念混淆导致设计与排障成本高
- 结论: 用”组件—消费模型—顺序性—分组—路由存储”五条主线统一术语口径
- 产出: 一页速查:Producer/Consumer/Broker、Push/Pull、Group、顺序消息、Tag/Queue
RocketMQ 相关术语
消息模型 Message Model
RocketMQ 是一个分布式消息中间件,主要由 Producer(生产者)、Broker(代理服务器)、**Consumer(消费者)**三大部分组成。
1. Producer
- 负责创建和发送消息到 Broker
- 支持同步发送、异步发送和单向发送三种模式
- 可以发送多种类型的消息:普通消息、顺序消息、事务消息等
2. Broker
- 是 RocketMQ 的核心组件,负责消息的存储和转发
- 在实际部署中,每个 Broker 对应一台物理服务器
- 采用主从架构设计,支持数据同步和故障转移
- 单个 Broker 可以存储多个 Topic 的消息
3. Consumer
- 负责从 Broker 订阅并消费消息
- 支持集群消费和广播消费两种模式
- 具有消息重试和死信队列机制确保消息可靠性
Message Queue
在 RocketMQ 中,所有消息队列都是持久化的。所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用 Offset 来访问。
Consumer Group
同一类 Consumer 的集合称为消费者组(Consumer Group),这类 Consumer 通常消费同一类 Topic 的消息且具有相同的消费逻辑。
- 负载均衡:同一个消费者组内的多个消费者实例会平均分配 Topic 中的消息队列
- 容错机制:当某个消费者实例下线时,它负责的消息队列会自动分配给组内其他存活的消费者实例
- 并行消费:通过增加消费者组内的实例数量,可以提高消息的消费吞吐量
集群消费
一个 Consumer Group 中的 Consumer 实例平均分摊消费消息,例如某个 Topic 有 9 条消息,其中一个 Consumer Group 有 3 个实例,那每个实例只消费其中的 3 条消息。
广播消费
在消息队列系统中,广播消费模式是指同一条消息会被发送给所有订阅该消息的消费者。这种情况下,每个消费者实例都会独立消费该消息。
ProducerGroup
同一类 Producer 集合通常属于同一个生产者组(Producer Group),这些 Producer 具有相同的配置和业务逻辑。
事务消息发送阶段
- 生产者首先向 Broker 发送”半消息”(Half Message),此时消息对消费者不可见
- Broker 将半消息持久化存储并返回确认响应
- 生产者执行本地事务逻辑
事务状态确认阶段
- 若原始生产者成功执行本地事务,会向 Broker 发送提交指令
- 若本地事务失败,则发送回滚指令
顺序消息
消费消息的顺序要同发送消息的顺序一致,在 RocketMQ 中主要是指局部顺序,即一类消息以满足顺序性,必须 Producer 单线程顺序发送,且发送到同一个队列。
普通顺序消息
- 发送端会根据消息的特定属性(如订单 ID)进行哈希取模计算
- 计算结果会决定该消息被发送到哪个具体的消息队列
- 同一个业务 ID 的消息会被路由到同一个队列,从而保证顺序性
严格顺序消息
顺序消息的一种,无论是正常异常情况都能保证顺序,但是牺牲了分布式 Failover 特性,即 Broker 集群中只要有一台机器不可用,在整个集群都不可用。
标签 Tag
为消息设置的标志,用于同一分区不同类型的消息,来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同的标签。
标签能够有效的保持代码的清晰度和连贯性,并优化 RocketMQ 提供的查询系统,消费者可以根据 Tag 实现对不同子主题的不同消费逻辑。
错误速查
| 症状 | 根因定位 | 修复 |
|---|---|---|
| 以为”广播消费=同组多实例分摊” | MessageModel=BROADCASTING,广播语义就是”每个实例各消费一次” | 用 CLUSTERING;广播场景必须保证业务幂等 |
| 同一个 Consumer Group 中实例订阅不一致 | 组内实例没有订阅完全相同 Topic/Tag | 统一订阅配置 |
| 顺序消息偶发乱序 | 队列数变化/扩缩容/故障切换导致路由到不同队列 | 普通顺序允许短暂乱序;敏感链路避免改队列数 |
| 事务消息半消息堆积、反复回查 | ProducerGroup 内实例未实现 TransactionCheckListener | 同组部署一致业务逻辑 |
| Tag 过滤无效/误过滤 | Producer 发送 Tag 与 Consumer 订阅表达式不一致 | 统一 Tag 命名与订阅表达式 |
| Offset 行为与预期不一致 | Offset 存储/重置策略误解 | 明确”位点归属=ConsumerGroup” |