Broker 是 RocketMQ 最核心服务节点,承担消息存储、接收发送、投递消息、元数据管理、HA 主从、定时延时、事务消息等能力,底层基于 Netty Remoting 对外提供服务。
1、消息接收与存储
- 接收生产者发送消息,做校验、解析。
- 写入 CommitLog,支持同步刷盘 / 异步刷盘。
- 异步构建
ConsumeQueue(消费队列索引)、IndexFile(消息 key 索引,根据 key 查询消息)。 - 支持普通消息、延时消息、事务消息、批量消息。
2、消息投递,处理消费者请求
- 处理消费者 PULL 拉消息请求(PushConsumer 底层也是 pull)。
- 根据 ConsumeQueue 索引,查找消息数据返回给客户端。
- 维护消费偏移量 offset:
- offset 可以存储在 Broker(默认);也可以存储在客户端本地。
- 处理消费结果:处理重试消息,把失败消息写入重试队列 % RETRY% 消费组名 ;重试耗尽转入死信队列
%DLQ%消费组名。
3、元数据管理功能
- Topic 管理:创建、更新 Topic,维护 Topic 与 MessageQueue 映射。
- 向所有 NameServer定时上报心跳与 Topic 路由元数据(30s 一次)。
- 维护消费组信息:接收消费者心跳,保存当前消费组在线消费者列表,返回给消费者用于客户端 Rebalance 重平衡。
4、主从高可用 HA 能力
- Master 接收写请求;Slave 不接收写(默认),只负责读。
- HA 模块:主从复制。支持异步复制、同步复制(同步双写)。
- Slave 通过
HAClient主动 pull 拉取 Master 的 CommitLog 数据做同步。 - 5.x DLedger‑Broker 支持自动选主、主节点故障自动切换。
5、特殊消息处理
① 延时消息
内部维护 SCHEDULE_TOPIC_XXXX 系统延时 topic;后台定时任务扫描到期消息,重新投递到业务 Topic。
② 事务消息
- 处理半消息(Prepared 消息);半消息存储在 CommitLog。
- 事务回查:定时向生产者发送 check 回调,查询本地事务状态(Commit / Rollback)。
- 根据生产者回执,把半消息提交或者回滚。
③ 顺序消费队列锁
为顺序消费MessageListenerOrderly提供MessageQueue 分布式锁;锁续约、锁超时释放,防止重平衡期间多实例并发消费同一个队列。
6、存储文件管理
- CommitLog 文件滚动(默认 1G);ConsumeQueue、IndexFile 文件管理。
- 消息文件过期清理:按照配置的保留时间,删除过期 CommitLog 物理文件。
- PageCache 友好,支持预分配文件。
所有 Topic 的消息全部顺序写入同一个 CommitLog 逻辑文件 ,不是每个 Topic 单独建日志文件;再配合 ConsumeQueue 做索引。
CommitLog 不是单个物理文件,是一组固定大小(默认 1G )的物理文件,滚动生成,逻辑上看成一个巨大文件。
核心目的是充分利用磁盘顺序写性能高的特点
结构举例:
java
CommitLog(真实消息体,全部消息顺序追加)
msgA(topic‑order) offset=0
msgB(topic‑pay) offset=200
msgC(topic‑order) offset=450
ConsumeQueue // topic‑order‑0索引文件,只存偏移索引
0: offset=0 len=200
1: offset=450 len=xxx
ConsumeQueue // topic‑pay‑0索引文件
0: offset=200 len=xxx
- 写消息:只追加写 CommitLog;异步构建各个 ConsumeQueue 索引。
- 消费消息:读 ConsumeQueue 拿到 CommitLog 物理 offset,再根据 offset 去 CommitLog 读真实消息内容。