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

消息队列进阶【RocketMQ 源码级解读图谱】

RocketMQ 源码级解读图谱

本文旨在展示 RocketMQ 核心模块关键方法调用顺序 + 内存布局 + 多线程刷盘线程

1. CommitLog 内部方法调用链 + 内存布局

1.1 内存布局与文件结构

顺序写
消息序列化
CommitLog
+MappedFileList mappedFileList
+putMessage(msg)
+flush(flushMode)
+retryAsyncFlush()
MappedFile
+ByteBuffer writeBuffer
+FileChannel fileChannel
+appendMessage(msg)
+flush()
AppendMessageCallback
+doAppend(fileOffset, msg)

说明

  • MappedFile 内存映射 CommitLog 文件

  • 消息顺序追加到 writeBuffer

  • AppendMessageCallback.doAppend() 将 MessageExt 序列化为二进制结构:

    • totalSize, magicCode, bodyCRC, queueId, queueOffset, physicalOffset, sysFlag, bornTimestamp, storeTimestamp, bodyLength, body

1.2 写入与刷盘线程调用链

ProducerCommitLogGroupCommitServiceOSCacheMappedFileputMessage(msg)appendMessage(msg)写入成功异步刷盘/同步刷盘将内存映射文件刷到磁盘完成返回刷盘结果SendResultProducerCommitLogGroupCommitServiceOSCacheMappedFile
  • GroupCommitService:同步刷盘线程
  • FlushRealTimeService:异步刷盘线程
  • 结合内存映射 + 零拷贝,提高写入吞吐和磁盘利用率

2. ConsumeQueue 内部调用链 + 内存布局

*
ConsumeQueue
+MappedFileList mappedFileList
+putMessagePosition(phyOffset, size, tagCode)
+getMessageByOffset(offset)
ConsumeQueueFile
+ByteBuffer buffer
+append(indexEntry)
+lookup(offset)

消息索引条目结构

  • physicalOffset: 消息在 CommitLog 偏移
  • size: 消息长度
  • tagsCode: 消息 Tag 哈希值

3. IndexFile 内部调用链

*
key -> hash
IndexFile
+hashSlotTable[]
+indexEntryList
+putKey(key, physicalOffset)
+queryKey(key)
indexEntryList
hashSlotTable
  • 支持根据消息 Key 快速查找物理偏移
  • Broker 插入消息时同步更新索引
  • 消费端可通过 queryMessageByKey() 高效查找

4. Producer 发送流程源码调用链

DefaultMQProducerDefaultMQProducerImplMQClientAPIImplBrokerCommitLogsend(msg)sendMessage(msg)selectQueue + sendKernelImpl(msg)appendMessage(msg)物理偏移SendResultSendResultSendResultDefaultMQProducerDefaultMQProducerImplMQClientAPIImplBrokerCommitLog

核心方法

  • DefaultMQProducerImpl.sendKernelImpl()
  • MQClientAPIImpl.sendMessage()
  • SendMessageProcessor.processRequest()

5. Consumer 拉取流程 + ack

DefaultMQPushConsumerPullMessageServiceBrokerConsumeQueueCommitLogexecutePullRequest()pullMessage(topic, queueId, offset)lookupMessage(offset)messageIndexListreadMessage(physicalOffset)MessageExt[]返回消息列表消息处理回调ackMessage(msgId)DefaultMQPushConsumerPullMessageServiceBrokerConsumeQueueCommitLog

6. 事务消息(半消息 + 回查)

TransactionMQProducerTransactionalMessageServiceBrokerConsumersendHalfMessage(msg)ackHalfexecuteLocalTransaction(msg)transactionResult(COMMIT / ROLLBACK)commitOrRollback(msgId)消息可见未提交消息回查 (定时)TransactionMQProducerTransactionalMessageServiceBrokerConsumer
  • Broker 定期扫描 HALF 消息并回查事务状态
  • 核心类:TransactionalMessageServiceCheckTransactionStateRequestHeader

7. 重试与死信队列(DLQ)

超过maxReconsumeTimes
消费失败消息
延迟队列Level1
延迟队列Level2
死信队列
重新消费
  • 核心类:RetryMessageServiceDefaultMessageStore.putMessage()
  • 延迟队列与 DLQ 逻辑分开管理,便于监控和补偿

8. Remoting 模块调用链(Netty 核心)

ProducerNettyRemotingClientNettyRemotingServerBrokersendRequest(msg)Netty TCP发送SendMessageProcessor.processRequest()SendResultTCP返回SendResultProducerNettyRemotingClientNettyRemotingServerBroker
  • Remoting 模块封装请求/响应
  • 支持同步、异步、单向发送
  • 高性能、异步通信基础

✅ 全景总结

这一版源码级图谱,完整覆盖:

  1. CommitLog / ConsumeQueue / IndexFile 内存布局与方法调用链
  2. Producer 消息发送流程与 ACK
  3. Consumer 消费、拉取、ack 流程
  4. 事务消息半消息机制 + 定时回查
  5. 顺序消息 Queue 绑定 + 线程绑定
  6. 重试队列 + 延迟队列 + DLQ
  7. Remoting 模块 Netty 异步通信
posted @ 2025-09-18 15:57  NeoLshu  阅读(4)  评论(0)    收藏  举报  来源