RocketMQ中的broker

Broker 是 RocketMQ 最核心服务节点,承担消息存储、接收发送、投递消息、元数据管理、HA 主从、定时延时、事务消息等能力,底层基于 Netty Remoting 对外提供服务。

1、消息接收与存储

  1. 接收生产者发送消息,做校验、解析。
  2. 写入 CommitLog,支持同步刷盘 / 异步刷盘。
  3. 异步构建 ConsumeQueue(消费队列索引)、IndexFile(消息 key 索引,根据 key 查询消息)。
  4. 支持普通消息、延时消息、事务消息、批量消息。

2、消息投递,处理消费者请求

  1. 处理消费者 PULL 拉消息请求(PushConsumer 底层也是 pull)。
  2. 根据 ConsumeQueue 索引,查找消息数据返回给客户端。
  3. 维护消费偏移量 offset:
    • offset 可以存储在 Broker(默认);也可以存储在客户端本地。
  4. 处理消费结果:处理重试消息,把失败消息写入重试队列 % RETRY% 消费组名 ;重试耗尽转入死信队列%DLQ%消费组名

3、元数据管理功能

  1. Topic 管理:创建、更新 Topic,维护 Topic 与 MessageQueue 映射。
  2. 向所有 NameServer定时上报心跳与 Topic 路由元数据(30s 一次)。
  3. 维护消费组信息:接收消费者心跳,保存当前消费组在线消费者列表,返回给消费者用于客户端 Rebalance 重平衡。

4、主从高可用 HA 能力

  1. Master 接收写请求;Slave 不接收写(默认),只负责读。
  2. HA 模块:主从复制。支持异步复制、同步复制(同步双写)
  3. Slave 通过HAClient主动 pull 拉取 Master 的 CommitLog 数据做同步。
  4. 5.x DLedger‑Broker 支持自动选主、主节点故障自动切换。

5、特殊消息处理

① 延时消息

内部维护 SCHEDULE_TOPIC_XXXX 系统延时 topic;后台定时任务扫描到期消息,重新投递到业务 Topic。

② 事务消息

  1. 处理半消息(Prepared 消息);半消息存储在 CommitLog。
  2. 事务回查:定时向生产者发送 check 回调,查询本地事务状态(Commit / Rollback)。
  3. 根据生产者回执,把半消息提交或者回滚。

③ 顺序消费队列锁

为顺序消费MessageListenerOrderly提供MessageQueue 分布式锁;锁续约、锁超时释放,防止重平衡期间多实例并发消费同一个队列。

6、存储文件管理

  1. CommitLog 文件滚动(默认 1G);ConsumeQueue、IndexFile 文件管理。
  2. 消息文件过期清理:按照配置的保留时间,删除过期 CommitLog 物理文件。
  3. 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 读真实消息内容。
相关推荐
白远山7 小时前
健身场馆无人自动化解决方案:从架构到落地实践
java·开发语言·数据库·数据挖掘·需求分析
user_admin_god7 小时前
第 01 篇:OpenAI 兼容 API 初探 —— 用 curl 跑通第一次对话
java·人工智能·spring boot·语言模型·devops
曹牧8 小时前
PostMan:400 Bad Request‌
java
devpotato8 小时前
RPO与RTO:容灾的两个关键指标
java·后端
宁渡AI大模型8 小时前
AI 全栈面试新趋势:Vibe Coding、前端、Java 后端高频面试题深度解析|河南宁渡科技有限公司编程教程
java·javascript·人工智能·python·ai大模型
CallFay云起未来8 小时前
AI客服如何与人工客服协同?从任务路由到上下文交接的Agent架构实践
java·人工智能·文心一言
cfm_29148 小时前
观察者模式
java
野生技术架构师9 小时前
1000+ Java面试题知识图谱:从基础语法到分布式架构的完整拓扑
java·面试
步行cgn9 小时前
Spring 底层如何创建对象:反射机制与实例化策略
java·后端·spring
何以解忧,唯有..9 小时前
Redis 过期事件监听:原理与实战
java