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 的消息且具有相同的消费逻辑。

  1. 负载均衡:同一个消费者组内的多个消费者实例会平均分配 Topic 中的消息队列
  2. 容错机制:当某个消费者实例下线时,它负责的消息队列会自动分配给组内其他存活的消费者实例
  3. 并行消费:通过增加消费者组内的实例数量,可以提高消息的消费吞吐量

集群消费

一个 Consumer Group 中的 Consumer 实例平均分摊消费消息,例如某个 Topic 有 9 条消息,其中一个 Consumer Group 有 3 个实例,那每个实例只消费其中的 3 条消息。

广播消费

在消息队列系统中,广播消费模式是指同一条消息会被发送给所有订阅该消息的消费者。这种情况下,每个消费者实例都会独立消费该消息。


ProducerGroup

同一类 Producer 集合通常属于同一个生产者组(Producer Group),这些 Producer 具有相同的配置和业务逻辑。

事务消息发送阶段

  1. 生产者首先向 Broker 发送”半消息”(Half Message),此时消息对消费者不可见
  2. Broker 将半消息持久化存储并返回确认响应
  3. 生产者执行本地事务逻辑

事务状态确认阶段

  • 若原始生产者成功执行本地事务,会向 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”