当前位置: 首页 > news >正文

RocketMQ 源码梳理

(一):NameServer 启动原理 + Broker 启动原理

一、NameServer 启动原理(源码级 + 流程图)

1.1 NameServer 核心作用(回顾)

  • 整个 RocketMQ 的路由中心 + 注册中心
  • 管理 Broker 信息、Topic 路由信息
  • 无状态、无主从、轻量高可用
  • 生产者 / 消费者定期拉取路由信息

1.2 NameServer 启动入口类

核心启动类

java

org.apache.rocketmq.namesrv.NamesrvStartup

启动命令:mqnamesrv最终执行的就是这个类的main方法。

1.3 NameServer 启动核心流程(源码步骤)

NameServer 启动分为5 大核心阶段

阶段 1:解析命令行与配置
  • 解析启动参数(-c 配置文件、-p 打印配置等)
  • 创建NamesrvConfigNettyServerConfig
  • 加载配置文件namesrv.conf
阶段 2:创建 NamesrvController 核心控制器

NamesrvController是 NameServer 的大脑,统筹所有组件:

  • 路由管理器(RouteInfoManager)
  • 配置管理器
  • Netty 服务器
阶段 3:初始化核心组件
  1. 初始化路由信息管理器:创建 Broker、Topic、集群路由表
  2. 初始化 Netty 配置:绑定端口 9876
  3. 初始化定时任务
    • 定期扫描(默认 10s)移除过期不心跳的 Broker
阶段 4:启动 Netty 服务端
  • 启动 Netty 监听端口 9876
  • 等待 Broker、Producer、Consumer 连接
阶段 5:注册 JVM 钩子,优雅关闭
  • JVM 退出时释放资源、关闭线程池

1.4 NameServer 启动完整流程图


1.5 NameServer 启动关键源码说明

// NamesrvStartup 启动核心代码 public static NamesrvController createAndStartNamesrvController(String[] args) throws MQClientException, InterruptedException { // 1. 解析配置 NamesrvConfig namesrvConfig = new NamesrvConfig(); NettyServerConfig nettyServerConfig = new NettyServerConfig(); nettyServerConfig.setListenPort(9876); // 默认端口 // 2. 创建控制器 NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig); // 3. 初始化 controller.initialize(); // 4. 启动 controller.start(); // 5. 优雅关闭 Runtime.getRuntime().addShutdownHook(...); return controller; }

核心定时任务(10s 扫描一次)

this.scheduledExecutorService.scheduleAtFixedRate(() -> { // 扫描并移除 120s 内未发送心跳的 Broker NamesrvController.this.routeInfoManager.scanNotActiveBroker(); }, 5, 10, TimeUnit.SECONDS);

二、Broker 启动原理(源码级 + 流程图)

2.1 Broker 核心作用(回顾)

  • 消息接收、存储、投递的核心组件
  • 向 NameServer 注册、发送心跳
  • 管理 CommitLog、ConsumeQueue、Index
  • 主从同步、副本同步、高可用

2.2 Broker 启动入口类

核心启动类

org.apache.rocketmq.broker.BrokerStartup

启动命令:mqbroker -n localhost:9876

2.3 Broker 启动核心流程(源码步骤)

Broker 启动比 NameServer 复杂,分为7 个核心阶段

阶段 1:解析启动参数与配置
  • 解析-n指定 NameServer 地址
  • 加载broker.conf
  • 创建:
    • BrokerConfig(Broker 配置)
    • NettyServerConfig(端口 10911)
    • NettyServerClient(客户端配置(broker向nameserver发送心跳等请求))

    • MessageStoreConfig(存储配置)
    • AuthConfig(认证 + 授权配置集合,Broker 启动阶段加载、初始化安全校验组件,管控所有客户端 / 集群节点接入权限)

阶段 2:创建 BrokerController 核心控制器

Broker 的总管家,统筹:

  • Netty 通信
  • 消息存储
  • 副本同步
  • 注册中心交互
阶段 3:初始化所有组件
  1. 初始化消息存储(CommitLog、ConsumeQueue)
  2. 时间轮服务
  3. 初始化 Netty 服务
  4. 启动客户端
  5. 管理Topic路由信息
  6. 初始化心跳定时任务
  7. 服务状态
阶段 4:启动消息存储服务
  • 加载 CommitLog、ConsumeQueue、Index
  • 恢复异常宕机数据
  • 启动刷盘线程(同步 / 异步)
阶段 5:启动 Netty 服务器
  • 监听 10911 端口
  • 处理 Producer、Consumer 请求
阶段 6:向 NameServer 注册 Broker
  • 发送注册请求
  • 启动定时心跳(每 30s 上报一次)
阶段 7:注册 JVM 钩子,启动完成

2.4 Broker 启动完整流程图


2.5 Broker 启动关键源码说明

// Broker 启动核心代码 public static BrokerController createAndStartBrokerController(String[] args) { // 1. 解析配置 BrokerConfig brokerConfig = new BrokerConfig(); NettyServerConfig nettyServerConfig = new NettyServerConfig(); nettyServerConfig.setListenPort(10911); // 2. 创建控制器 BrokerController controller = new BrokerController( brokerConfig, nettyServerConfig, nettyClientConfig, messageStoreConfig ); // 3. 初始化 controller.initialize(); // 4. 启动 controller.start(); return controller; }

Broker 注册与心跳(关键)

// 启动后立即注册 this.brokerOuterAPI.registerBrokerAll(...); // 定时心跳(30s) this.scheduledExecutorService.scheduleAtFixedRate(() -> { BrokerController.this.brokerOuterAPI.registerBrokerAll(...); }, 0, 30, TimeUnit.SECONDS);

三、NameServer vs Broker 启动核心区别

表格

组件启动复杂度核心任务关键端口依赖
NameServer路由管理、心跳检测9876
Broker消息存储、收发、注册、同步10911必须依赖 NameServer

四、本章总结

  1. NameServer 启动:轻量、无状态,核心是路由表 + Netty + 定时扫描,启动快、无依赖。
  2. Broker 启动:重量级、有状态,核心是消息存储 + Netty + 注册 NameServer + 心跳保活
  3. 两者启动流程都遵循:
    • 加载配置 → 创建控制器 → 初始化组件 → 启动网络 → 注册 / 心跳 → 优雅关闭
  4. Broker 强依赖 NameServer,启动必须指定-n地址。
http://www.jsqmd.com/news/959553/

相关文章:

  • 多维聚合不是加GROUP BY:高维立方体建模与性能优化实战
  • 如何高效使用HsMod:炉石传说完整自定义体验终极指南
  • PingFangSC字体高效应用实战指南:从安装到性能优化的完整解决方案
  • 2026年Q2国内精益质量管理咨询服务机构排行盘点:精益财务管理、精益质量管理变革、精益仓储变革、精益仓储管理选择指南 - 优质品牌商家
  • 5个实用技巧:彻底解决多平台音乐搜索难题的完整方案
  • AI代理安全治理:从身份管控到决策可观测的七项实操底线
  • 2026年评价高的车间粉尘报警器/壁挂式粉尘报警器/台式粉尘报警器厂家推荐与选型指南 - 行业平台推荐
  • STM32F103驱动XPT2046电阻屏:从硬件连接到坐标转换的保姆级避坑指南
  • 从字节流到可读数据:C语言中串口数据解析的完整流程(含代码片段)
  • 鸣潮自动化工具:3步实现游戏智能辅助,解放双手轻松刷图
  • 如何零成本搭建专业级A股智能分析系统:3步实现机构级投资决策
  • 2026年主流平面MOS实测评测:低压MOS/平面MOS/替代料MOS/沟槽MOS/现货MOS/超结MOS/高压MOS/选择指南 - 优质品牌商家
  • elm-mdl核心组件解析:Buttons、Cards与Dialogs的终极使用指南
  • Cursor Free VIP:智能解锁AI编程工具完整权限的终极指南
  • 从《悲惨世界》到NPM依赖:手把手教你用pyecharts玩转两类经典关系网络图
  • 终极磁盘清理神器:Krokiet与Czkawka的12种文件管理魔法
  • 如何用mootdx高效处理通达信财务数据:从批量下载到智能分析
  • 2026年实际成本分摊ERP方案排行:步思 WMS、步思 成本解决方案、BC Barcode、BC COST选择指南 - 优质品牌商家
  • 如何用OBS Studio打造专业级直播:从入门到精通的完整指南
  • PowerToys-CN终极指南:5步掌握中文增强版Windows工具箱
  • 2026钢质抗风门技术解析与权威厂家实测对比 - 优质品牌商家
  • 如何在5分钟内用Instant-NGP实现闪电般的3D场景重建?完整实践指南
  • 别再死锁了!聊聊C++里那个允许你‘套娃’的std::recursive_mutex
  • 国内马铃薯全粉加工设备评测:预糊化淀粉辊筒干燥机/马铃薯全粉加工设备/马铃薯全粉生产线/马铃薯全粉设备/马铃薯雪花全粉设备/选择指南 - 优质品牌商家
  • OptiScaler终极性能调优指南:5个关键配置让你的游戏帧率提升50%
  • AI落地实战:任务切片、提示工程与本地化适配三步法
  • BERT如何重塑NLP工程实践:从预训练到生产部署
  • 2026年比较好的硬脂酸镁片剂辅料/硬脂酸镁抗粘剂/硬脂酸镁脱模剂用户口碑推荐厂家 - 品牌宣传支持者
  • 3分钟掌握无损歌词获取:网易云音乐与QQ音乐歌词下载终极指南
  • 2026年热门的防爆粉尘报警器/台式粉尘报警器/在线粉尘报警器厂家哪家好 - 品牌宣传支持者