RocketMQNotes

第 17 章:Broker 架构

zjc 于 2026-01-17 发布

这是《RocketMQ 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Broker 是 RocketMQ 的存储与服务节点。它接收生产者请求,维护 Topic 路由和队列,写入 CommitLog,构建消费索引,向消费者提供拉取服务,并参与权限控制、延迟调度、事务回查和高可用切换。

17.1 整体组件

Broker
  |-- remoting server       网络通信
  |-- topic manager         Topic、队列、权限
  |-- message store         CommitLog、ConsumeQueue、Index
  |-- consumer manager      消费组、位点、订阅
  |-- transaction service   半消息与回查
  |-- schedule service      延迟或定时消息
  |-- replication           主从复制
  |-- admin service         运维接口
  `-- stats / metrics       指标与审计

Broker 不是简单转发进程,大多数核心逻辑都围绕本地存储状态展开。

17.2 请求处理链路

发送:

client request
  -> decode protocol
  -> auth and rate limit
  -> validate topic
  -> append message
  -> replicate / flush
  -> response

消费:

consumer pull request
  -> check subscription
  -> read consumequeue
  -> filter message
  -> read commitlog
  -> response
  -> consumer commit offset later

理解链路有助于判断瓶颈在 CPU、内存、磁盘、网络还是下游服务。

17.3 Topic 与路由

Broker 维护:

对象 内容
TopicConfig 队列数、权限、类型
QueueData Broker、queueNum、权限
RouteInfo NameServer 汇总后的路由

NameServer 保存路由快照,不负责强一致事务。Broker 配置修改后要确认所有 NameServer 的视图一致。

17.4 消费组管理

Broker 记录:

  1. 消费组名称;
  2. 订阅关系;
  3. 队列位点;
  4. 客户端连接;
  5. 重试和死信配置。

订阅关系必须一致:

group: order-consumer
instance A -> OrderTopic, TagA
instance B -> OrderTopic, TagB

同一消费组订阅不同 Topic 或 Tag,会导致消费异常、队列分配混乱或位点不正确。

17.5 线程模型

常见线程类型:

线程 作用
Accept / EventLoop 网络连接和 IO
Request worker 请求处理
PutMessage 消息写入
PullMessage 消息读取
Reput 索引分发
Flush 刷盘
Clean 文件回收
Admin 运维命令

线程堆积通常不是“加线程数”能解决的问题,要先看锁竞争、磁盘延迟、页缓存和下游状态。

17.6 内存与磁盘

内存主要用于:

  1. 网络缓冲;
  2. 热点队列索引;
  3. 消息查询;
  4. 线程栈;
  5. 页缓存。

磁盘主要用于:

  1. CommitLog;
  2. ConsumeQueue;
  3. IndexFile;
  4. 配置和 checkpoint;
  5. 日志。

生产建议:

  1. 数据盘与系统盘分离;
  2. 日志目录单独监控;
  3. 避免多个存储型服务抢盘;
  4. 关注 inode、文件句柄、目录项;
  5. 使用与集群规模匹配的磁盘类型。

17.7 限流与保护

Broker 可以从以下维度保护:

维度 示例
Topic 限制写入 TPS
消息大小 拒绝超大消息
队列 防止单队列热点
消费拉取 限制空拉和过载
请求 限制 admin 和查询
磁盘 高水位拒写

应用侧也应设置生产并发和重试上限,避免 Broker 故障时客户端重试风暴。

17.8 安全边界

Broker 层安全包括:

  1. ACL 账号;
  2. Topic 读写权限;
  3. 管理接口鉴权;
  4. TLS 传输加密;
  5. IP 白名单;
  6. 审计日志。

最小权限示例:

order-service:
  OrderTopic        READ_WRITE
  OrderDLQTopic     READ
  admin topic       DENY

不要给业务应用统一管理员账号。

17.9 观测指标

broker_active_connections
broker_request_queue_size
broker_put_tps
broker_get_tps
broker_put_latency_p99
broker_pull_latency_p99
broker_thread_pool_active
commitlog_dispatch_lag
broker_disk_usage
broker_exception_total

排障时先固定一个视角:

时间线
  -> 客户端现象
  -> Broker 指标
  -> 磁盘和网络
  -> 代码或配置变更

17.10 常见故障

现象 可能原因
Broker 退出 OOM、磁盘损坏、系统重启、误操作
请求堆积 磁盘慢、热点 Topic、线程池满
Topic 不存在 配置丢失、环境错误、权限
路由不更新 NameServer 连接异常
消费位点丢失 配置损坏、异常恢复、误操作
查询慢 冷读、索引重、磁盘竞争

本章小结

Broker 的核心职责是把网络请求转换为可靠的本地存储状态,并维护 Topic、队列、消费组、事务和复制的一致性。读懂数据流和线程模型,才能判断性能瓶颈与故障根因。生产环境必须同时治理磁盘、路由、订阅、权限、限流和指标。

思考题

  1. Broker 与 NameServer 的职责边界是什么?
  2. 为什么同一消费组订阅关系必须一致?
  3. 哪些问题会表现为请求线程堆积?
  4. Broker 高磁盘水位应该如何处理?
  5. 为什么业务应用不应使用管理员账号?