RocketMQ 源码梳理
一NameServer 启动原理 Broker 启动原理一、NameServer 启动原理源码级 流程图1.1 NameServer 核心作用回顾整个 RocketMQ 的路由中心 注册中心管理 Broker 信息、Topic 路由信息无状态、无主从、轻量高可用生产者 / 消费者定期拉取路由信息1.2 NameServer 启动入口类核心启动类javaorg.apache.rocketmq.namesrv.NamesrvStartup启动命令mqnamesrv最终执行的就是这个类的main方法。1.3 NameServer 启动核心流程源码步骤NameServer 启动分为5 大核心阶段阶段 1解析命令行与配置解析启动参数-c 配置文件、-p 打印配置等创建NamesrvConfig、NettyServerConfig加载配置文件namesrv.conf阶段 2创建 NamesrvController 核心控制器NamesrvController是 NameServer 的大脑统筹所有组件路由管理器RouteInfoManager配置管理器Netty 服务器阶段 3初始化核心组件初始化路由信息管理器创建 Broker、Topic、集群路由表初始化 Netty 配置绑定端口 9876初始化定时任务定期扫描默认 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:98762.3 Broker 启动核心流程源码步骤Broker 启动比 NameServer 复杂分为7 个核心阶段阶段 1解析启动参数与配置解析-n指定 NameServer 地址加载broker.conf创建BrokerConfigBroker 配置NettyServerConfig端口 10911NettyServerClient(客户端配置(broker向nameserver发送心跳等请求))MessageStoreConfig存储配置AuthConfig(认证 授权配置集合Broker 启动阶段加载、初始化安全校验组件管控所有客户端 / 集群节点接入权限)阶段 2创建 BrokerController 核心控制器Broker 的总管家统筹Netty 通信消息存储副本同步注册中心交互阶段 3初始化所有组件初始化消息存储CommitLog、ConsumeQueue时间轮服务初始化 Netty 服务启动客户端管理Topic路由信息初始化心跳定时任务服务状态阶段 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四、本章总结NameServer 启动轻量、无状态核心是路由表 Netty 定时扫描启动快、无依赖。Broker 启动重量级、有状态核心是消息存储 Netty 注册 NameServer 心跳保活。两者启动流程都遵循加载配置 → 创建控制器 → 初始化组件 → 启动网络 → 注册 / 心跳 → 优雅关闭Broker 强依赖 NameServer启动必须指定-n地址。