【RocketMQ】第4节|RocketMQ核心源码解读

一、源码环境搭建

主要功能模块

最新版本:5.3.3

  • broker:Broker模块(broke启动进程)。
  • client:消息客户端,包含消息生产者、消费者相关类。
  • example:RocketMQ示例代码。
  • namesrv:NameServer模块。
  • store:消息存储模块。
  • remoting:远程访问模块。

(二)源码启动服务

  1. 编译指令mvn clean install -Dmaven.test.skip=true
  2. 启动NameServer:运行org.apache.rocketmq.namesrv.NamesrvStartup类,可通过-c参数指定配置文件,-p参数打印生效参数。
  3. 启动Broker:启动入口为broker模块的BrokerStartup类,可通过-c参数指定broker.conf文件,-p-m参数打印配置信息。

(三)读源码的方法

  1. 带着问题读源码,避免盲目阅读。
  2. 采用“小步快走”策略,分阶段逐步理解源码。
  3. 及时总结,验证扩展功能,理解单元测试。

二、源码热身阶段

(一)NameServer的启动过程

  1. 核心作用:提供Broker端的服务注册与发现功能,类似微服务中的注册中心。
  2. 启动入口org.apache.rocketmq.namesrv.NamesrvStartup类,核心是构建并启动NamesrvController
  3. 核心组件:包括RouteInfoManager(路由管理)、BrokerHousekeepingService(Broker状态管理)、NettyRemotingServer(Netty服务端)等。

(二)Broker服务启动过程

  1. 核心作用:处理消息存储、转发等核心业务。
  2. 启动入口BrokerStartup类的main方法,围绕BrokerController对象启动。
  3. 核心配置BrokerConfig(服务配置)、MessageStoreConfig(消息存储配置)、NettyServerConfig(Netty服务端配置)等。
  4. 核心服务:启动了messageStore(消息存储)、remotingServer(Netty服务端)、brokerOuterAPI(对外通信)等服务。

三、小试牛刀阶段

(一)Netty服务注册框架

  1. 核心组件RemotingServer(服务端)和RemotingClient(客户端),基于Netty实现远程调用。
  2. 通信协议RemotingServer接口有NettyRemotingServerMultiProtocolRemotingServer实现,支持不同协议。
  3. 请求处理:请求封装为RemotingCommand对象,通过processorTable注册处理器处理不同请求,支持同步和异步调用。

(二)Broker心跳注册管理

  1. 注册过程:Broker启动后通过registerBrokerAll方法向NameServer注册心跳,定时任务以30秒间隔持续发送心跳。
  2. NameServer管理:通过RouteInfoManager维护Broker信息,启动定时任务扫描不活动Broker。
  3. 设计优势:NameServer轻量,集群只需一个节点存活,牺牲数据一致性换取可用性。

(三)Producer发送消息过程

  1. 启动流程:调用DefaultMQProducerImpl.start方法,通过MQClientFactory启动服务,注册到producerTable

  1. 负载均衡:默认轮询MessageQueue,失败后跳过该Broker;可通过MessageQueueSelector指定队列,实现局部有序。
  2. 路由管理:维护topicPublishInfoTable缓存,NameServer挂掉后仍可基于本地缓存发送消息。

(四)Consumer拉取消息过程

  1. 启动流程:通过MQClientFactory启动,注册到consumerTable,设置AllocateMessageQueueStrategy分配队列。

  1. 消费模式
    • 集群模式:Offset保存在Broker,MessageQueue平均分配给消费者。
    • 广播模式:Offset保存在本地,所有消费者获取所有MessageQueue。
  2. 顺序消费:通过锁定队列,保证同一队列消息顺序处理;并发消费不控制队列,多线程并发处理。

(五)客户端负载均衡管理总结

  1. Producer负载均衡:轮询MessageQueue,支持故障规避和自定义选择器。

  1. Consumer负载均衡:集群模式下通过多种算法分配MessageQueue,广播模式下所有消费者获取所有队列。

四、融汇贯通阶段

(一)消息持久化设计

  1. 文件结构
    • CommitLog:存储消息元数据,顺序写入,每个文件1G。
    • ConsumeQueue:存储消息在CommitLog的索引,一个MessageQueue一个文件。
    • IndexFile:提供按key或时间查询消息的索引。
    • 辅助文件checkpoint(检查点)、config(配置)、abort(服务关闭标识)。

  1. commitLog写入:加锁保证顺序写入,通过mappedFile.appendMessage实现顺序写,写入后触发刷盘和主从复制。
  2. 刷盘机制
    • 同步刷盘:通过GroupCommitService等待刷盘完成,数据安全性高。

    • 异步刷盘:通过CommitRealTimeService定时刷盘,性能更高。
  1. 主从复制DefaultHAService启动守护进程,实现主从同步复制和异步复制。
  2. 索引分发reputMessageService后台线程分发消息,构建ConsumeQueue和IndexFile索引。
  3. 过期文件删除:定时任务检查CommitLog和ConsumeQueue文件,超过72小时删除,可通过配置调整。

7.文件索引结构

(二)延迟消息机制

  1. 固定延迟级别:消息存入SCHEDULE_TOPIC_XXXX主题对应队列,scheduleMessageService定时扫描,延迟时间到后转储回原主题。
  2. 指定时间点:消息存入rmq_sys_wheel_timer主题,通过时间轮算法(TimerWheel)判断到期时间,到期后转储。

(三)长轮询机制

  1. 功能作用:避免Consumer空轮询,缓存Pull请求,消息到达时及时通知Consumer。
  2. 实现流程PullMessageProcessor处理请求,PullRequestHoldService后台线程检查缓存请求,消息到达时触发通知。

五、基于RocketMQ源码理解零拷贝与顺序写

(一)顺序写加速文件写入磁盘

  1. 原理:提前申请连续磁盘空间,避免随机写寻址,性能接近内存级别。
  2. 实现:RocketMQ通过mappedFile.appendMessage实现顺序写,CommitLog文件固定大小。

(二)刷盘机制保证消息不丢失

  1. PageCache缓存:消息先写入PageCache,需刷盘到磁盘才能持久化。
  2. 刷盘方式:同步刷盘和异步刷盘,可通过flushDiskType配置。

(三)零拷贝加速文件读写

  1. mmap文件映射:将文件映射到用户态内存,减少内核态与用户态数据拷贝,适合小文件。

  1. sendFile机制:内核态直接传输数据,无需用户态参与,适合大数据传输。

  1. RocketMQ应用:大量使用mmap机制,功能丰富;Kafka更多使用sendfile,性能更高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值