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 读真实消息内容。
相关推荐
计算机编程-吉哥6 分钟前
计算机毕业设计 基于 SpringBoot + Vue 的剧本杀系统 Java毕业设计【任务书、开题报告、中期报告、论文、源码】
java·vue.js·spring boot·毕业设计·课程设计·计算机毕业设计选题
code2cat15 分钟前
【随笔】RAG语义缓存:问题很相似,答案就能直接复用吗
java·缓存·知识库·rag
Rain的Java大神之路37 分钟前
面了 50 个候选人,90% 都挂在 LeetCode 3 无重复字符的最长子串:滑动窗口的 5 个致命坑
java·后端·leetcode
西凉的悲伤38 分钟前
Jsoup 库 HTML 解析详解
java·前端·html·jsoup
十碗饭吃不饱1 小时前
Apache POI 踩坑:setFontFamily 二次设置字体不生效、样式残留问题深度解析
java·word·apache
我命由我123451 小时前
6-2.Python 异常处理 - 异常捕获(捕获指定异常、常见异常类型、异常信息)
java·运维·开发语言·python·http·https·java-ee
zaizai10071 小时前
STL深度剖析2
java·c++·算法
周厉1 小时前
WebSocket 使用场景与实现方法:Java + Vue3 全栈实战
java·websocket·vue3·websocket双向通讯
wdfk_prog1 小时前
lwip教程 38:从 `lwipopts.h` 到 Port Contract——lwIP 裁剪、构建选择、OS Port 与 Network Port
java·开发语言
吹什么轩2 小时前
MySQL 内置函数全景:日期 / 字符串 / 数学 / 其他,一次讲透(附索引杀手排查)
java·数据库·面试