当前位置: 首页 > 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.gsyq.cn/news/1471231.html

相关文章:

  • 别再只用123456了!手把手教你用L0phtCrack 5自测Windows密码强度(附实战截图)
  • 非标异形件定制核心技术逻辑与行业合格供应商盘点:螺丝批发、防松螺丝、非标异形件定制、304螺丝、316螺丝、不锈钢螺丝选择指南 - 优质品牌商家
  • 2026年Q2国内精益质量管理咨询服务机构排行盘点:精益财务管理、精益质量管理变革、精益仓储变革、精益仓储管理选择指南 - 优质品牌商家
  • 5个实用技巧:彻底解决多平台音乐搜索难题的完整方案
  • 如何用OBS Studio打造专业级直播:从入门到精通的完整指南
  • 2026钢质抗风门技术解析与权威厂家实测对比 - 优质品牌商家
  • 2026年实际成本分摊ERP方案排行:步思 WMS、步思 成本解决方案、BC Barcode、BC COST选择指南 - 优质品牌商家
  • PowerToys-CN终极指南:5步掌握中文增强版Windows工具箱
  • OptiScaler终极性能调优指南:5个关键配置让你的游戏帧率提升50%
  • 国内马铃薯全粉加工设备评测:预糊化淀粉辊筒干燥机/马铃薯全粉加工设备/马铃薯全粉生产线/马铃薯全粉设备/马铃薯雪花全粉设备/选择指南 - 优质品牌商家
  • 2026年比较好的硬脂酸镁片剂辅料/硬脂酸镁抗粘剂/硬脂酸镁脱模剂用户口碑推荐厂家 - 品牌宣传支持者
  • AI落地实战:任务切片、提示工程与本地化适配三步法
  • 2026年热门的防爆粉尘报警器/台式粉尘报警器/在线粉尘报警器厂家哪家好 - 品牌宣传支持者
  • 在职考研党必看:同济大学电子信息(非全)专业课888,我是如何用最少时间搞定物理和计算机的?
  • 保姆级教程:用Docker Compose部署CVAT标注平台,从安装到成功访问的完整避坑指南
  • 海康威视Win64 C++客户端开发套件:含全功能Demo源码与MFC标准实现
  • 深入Paging3:安卓分页加载框架的权威指南
  • 别只用True/False了!用Python的‘^’运算符玩转数据加密与简单校验
  • Anthropic语义压缩层:大模型推理链路的‘归零’革命
  • 为什么选择mcrcon?对比其他RCON客户端的5大优势分析
  • 碎片化时代,成年人的英语精进方式
  • 2026年推荐几家黑龙江打井工程/黑龙江工程钻井/哈尔滨打桩/哈尔滨钻井厂家精选合集 - 品牌宣传支持者
  • 2026年义乌自驾租车品牌排行 核心服务维度实测对比 - 优质品牌商家
  • 免F漫画:创漫客 v1.0.1 纯净版(附网盘)
  • 超越YOLO官方配置:深入浅出图解CIoU Loss,如何让你的边界框回归更精准
  • Video2X:免费AI视频超分辨率工具,让模糊视频瞬间变高清的终极解决方案
  • 宝塔面板下PHP8.0安装Swoole扩展,从源码编译到WebSocket服务部署的完整避坑记录
  • 0基础学AI智能体,Coze和n8n该学那个?有什么区别吗?
  • 保姆级避坑指南:用ESP8266+Arduino连接OneNet旧版MQTT(附完整代码与常见错误排查)
  • 如何在浏览器中创建专业行为实验:jsPsych终极指南