文章中如果有图看不到,可以点这里去 csdn 看看。从那边导过来的,文章太多,没法一篇篇修改好。

RocketMQ 内容详解【三、源码篇(深度剖析与实现细节 · 机制扩展版)】

第三章 · 源码篇(深度剖析与实现细节 · 机制扩展版)

3.1 Broker 内部机制

3.1.1 启动与注册机制

Broker 启动时,首先加载配置文件,包括 Broker 名称、角色(Master / Slave)、存储路径、监听端口等,然后进行 NameServer 注册,以便 Producer 和 Consumer 能够通过 NameServer 查询 Topic 路由信息。

  • 注册流程

    1. Broker 启动 → 构造 BrokerController
    2. 调用 registerBrokerAll() 向 NameServer 注册 Broker 信息。
    3. NameServer 返回 Topic 路由信息缓存。
    4. Broker 启动 Netty 服务监听客户端请求(Producer/Consumer)。
  • 机制解析

    • NameServer 采用轻量级服务发现机制,无状态设计。
    • Broker 注册信息包括:BrokerName、BrokerId、队列数量、Topic 列表等。
    • 通过轮询或负载均衡策略,Producer 可以选择 Broker 进行消息发送。
BrokerNameServerProducerregisterBroker()返回注册确认可用路由信息BrokerNameServerProducer

3.1.2 消息存储机制

RocketMQ Broker 核心存储机制是 顺序写 + 逻辑索引,保障高吞吐和可靠性。

  1. CommitLog(消息主体存储)

    • 顺序追加写入文件,减少磁盘随机 I/O。
    • 使用 MappedFile 内存映射 + AppendMessageCallback,实现零拷贝。
    • 支持同步刷盘和异步刷盘两种模式。
  2. ConsumeQueue(逻辑队列索引)

    • 每个 Topic + Queue 对应一个 ConsumeQueue。
    • 每条索引记录消息物理偏移、消息长度、tagCode。
    • Consumer 拉取消息时通过 ConsumeQueue 快速定位 CommitLog。
  3. IndexFile(Key 索引)

    • 建立消息 Key 到物理偏移的倒排索引。
    • 支持高效的按 Key 查询。
  4. 延迟队列 & 死信队列

    • 消费失败消息进入延迟队列,根据 delayLevel 定期重试。
    • 超过最大重试次数的消息进入 DLQ,保证消费异常可追溯。
CommitLog
ConsumeQueue
IndexFile
延迟队列
Consumer
死信队列

机制解析

  • 顺序写保证高吞吐。
  • 逻辑索引解耦消息存储与消费,支持快速查找。
  • 延迟队列和 DLQ 提供消息可靠性保障和补偿能力。

3.1.3 高可用机制

RocketMQ 提供三种高可用模式:

  1. 同步双写(SYNC_MASTER)

    • Producer 发送消息,Master 和 Slave 都写入 CommitLog 才返回 ACK。
    • 保障强一致性,但吞吐稍低。
  2. 异步复制(ASYNC_MASTER)

    • Master 写入 CommitLog 后立即返回 ACK。
    • Slave 异步复制消息,提高吞吐。
  3. DLedger 分布式日志模式

    • 基于 Raft 协议,实现 Leader / Follower 多节点同步。
    • 消息写入需超过多数节点 ack 才认为成功。
ProducerBrokerMasterBrokerSlaveLeaderFollower1Follower2sendMessage()replicate()ackSendResultsendMessage()SendResultreplicateAsync()sendMessage()replicatereplicateackackSendResultalt[SYNC_MASTER][ASYNC_MASTER][DLedger]ProducerBrokerMasterBrokerSlaveLeaderFollower1Follower2

3.2 Producer 内部机制

3.2.1 消息发送机制

  • 发送模式

    1. 同步发送:等待 Broker ACK。
    2. 异步发送:回调通知结果。
    3. 单向发送:不等待 ACK,适合日志类消息。
  • 负载均衡机制

    • Producer 根据路由信息选择 Broker 和队列。
    • 默认轮询算法,也支持自定义策略。
Producer
NameServer: 查询路由
缓存Broker & Queue信息
根据负载均衡策略选择Queue

3.2.2 路由刷新机制

  • 路由信息缓存(TopicRouteTable)过期或发送失败时触发刷新。
  • Producer 自动重新拉取 NameServer 信息,保证消息发送可达性。
  • 支持 Broker 动态扩容和 Topic 动态增减队列。

3.3 Consumer 内部机制

3.3.1 Rebalance 机制

  • 消费组内多个 Consumer 消费同一 Topic 的消息,需要均衡分配。
  • 核心类:RebalanceImpl
  • 支持多种队列分配策略(平均分配、环形分配等)。
ConsumerRebalanceImplBrokerdoRebalance()查询Topic路由分配Queue列表ConsumerRebalanceImplBroker

3.3.2 消息拉取与长轮询

  • PullMessageService 负责轮询拉取消息。
  • 支持 长轮询:Broker 阻塞等待消息到达,提高即时性。
  • 消费端缓存已拉取消息在 ProcessQueue,按顺序或批量消费。
ConsumerPullMessageServiceBrokerCommitLogConsumeQueuesubmitPullRequest()pullMessage(topic, queueId, offset)lookupMessage(offset)messageIndexListreadMessage(physicalOffset)MessageExt[]返回消息列表消费回调ConsumerPullMessageServiceBrokerCommitLogConsumeQueue

3.3.3 消费进度机制

  • 消费成功后更新 offset:

    • Push 模式:异步提交到 Broker。
    • Pull 模式:可配置存储策略(内存/本地/远程)。
  • 支持顺序消费、批量消费与并发消费模式。


3.4 事务消息机制

  • 半消息发送到 Broker,暂时不可见。
  • Producer 执行本地事务后提交或回滚。
  • Broker 定期扫描 HALF 消息,回查事务状态,保证最终一致性。
ProducerTransactionManagerBrokerConsumersendHalfMessage()ackHalfexecuteLocalTransaction()COMMIT/ROLLBACKcommitOrRollback()消息可见ProducerTransactionManagerBrokerConsumer

3.5 顺序消息机制

  • Producer 根据业务 Key 计算 QueueId。
  • Broker 保证顺序写入 CommitLog 与 ConsumeQueue。
  • Consumer 对同一队列单线程消费,确保顺序。
ProducerBrokerConsumersend(msg, queueId = hash(key) % N)按队列顺序分配Consumer线程ackMessageProducerBrokerConsumer

3.6 重试与死信机制

  • 消费失败消息进入延迟队列,按 delayLevel 分级重试。
  • 超过最大重试次数进入 DLQ,便于人工处理或补偿。
超过maxReconsumeTimes
消费失败
延迟队列1
重新消费
延迟队列2
死信队列

✅ 本章扩展总结

  • Broker:启动、存储、注册机制。
  • Producer:发送、路由、负载均衡、事务消息。
  • Consumer:Rebalance、长轮询、消费进度管理。
  • 高可用机制:同步双写、异步复制、DLedger。
  • 可靠性保障:顺序消费、重试、死信队列、事务消息。

本章融合文字描述与 Mermaid 图谱,提供从源码调用链到消息流转、线程模型、事务机制、顺序保证和高可用复制的 深度机制解析,适合高级开发者和架构师系统理解 RocketMQ 内部原理。

posted @ 2025-09-18 16:06  NeoLshu  阅读(4)  评论(0)    收藏  举报  来源