跳转至

RocketMQ 架构与核心概念

30 秒版(开场)

RocketMQ 是 NameServer(路由)+ Broker(存储)+ Producer/Consumer 的分布式消息中间件。消息按 Topic 分类,Queue 是并行与顺序域。事务、延迟和 FIFO 是其重要能力,但具体 API 与限制要区分 4.x/5.x;Go 客户端也要核对与目标 broker 的兼容矩阵。

3 分钟版(精讲深度)

  1. 是什么:阿里开源 MQ,支持普通/FIFO/事务/延迟消息;NameServer 提供路由发现,Broker 可采用主从、Controller/DLedger 等不同高可用部署,版本与模式要说清。
  2. 为什么:国内业务、电商、支付场景常见;选用时需讲清 与 Kafka 的语义与运维差异。
  3. 怎么做:Producer 发 Topic:Tag;Broker 写 CommitLog + ConsumeQueue 索引;Push/Pull 消费;Consumer Group 内 集群消费(一条消息只被一个实例消费)或 广播消费。

10 分钟版(原理 + 图示)

flowchart LR
  P[Producer] --> NS[NameServer]
  P --> B1[Broker Master]
  B1 --> B2[Broker Slave]
  C[Consumer Group] --> NS
  C --> B1
概念 说明
Topic 逻辑分类,如 ORDER_TOPIC
Tag 子过滤,如 create / pay
Queue Topic 下分片,顺序消息绑定单 Queue
Consumer Group 同组 集群消费(一条消息只被一个实例消费);不同 Group 各自独立消费全量(类似 Kafka 多订阅)
MessageModel CLUSTERING(默认,负载均衡)vs BROADCASTING(同组每实例全量)
Offset 消费进度,Broker 或本地管理

存储:CommitLog 顺序写 + ConsumeQueue 定长索引(类似 Kafka 分区日志思想,实现不同)。

生产场景

  • 订单创建 → 下游库存、积分、通知
  • 需要 延迟关单、事务消息(半消息)的支付链路
  • 运维:Broker 磁盘、CommitLog 清理、消费堆积告警

排查与工具

  • RocketMQ Console:Topic 堆积、消费 TPS、DLQ
  • mqadmin:集群状态、消费进度 reset(慎用)
  • 日志:broker.log、慢消费、send timeout

架构取舍

选型 适用
RocketMQ 国内云、事务/延迟/顺序、电商
Kafka 超高吞吐日志流、大数据管道
Redis Stream 轻量、小规模

深挖问答

  1. NameServer 挂了? → 短时用本地缓存路由;新 Broker 无法注册;已有连接可继续一段时间。
  2. Tag 和 Key 区别? → Tag 订阅过滤;Key 业务索引、消息查询。
  3. Push 和 Pull? → Push 实为 Broker 长轮询推;Pull 自主拉,灵活但复杂。
  4. Go 客户端注意? → 消费幂等、Rebalance 时重复消费、优雅 Shutdown。

反模式与事故

  • Topic 过少、单 Queue 热点 → 并行度不足
  • 消费慢不扩容 Consumer → 堆积拖垮 Broker
  • 广播消费误用于需分摊流量的场景 → 每台都处理全量

代码示例

// 概念:Producer 发送(apache/rocketmq-client-go v2 风格示意)
msg := primitive.NewMessage("OrderTopic", body)
msg.WithTag("created")
msg.WithKeys([]string{orderID})
_, err := producer.SendSync(ctx, msg)

延伸阅读