rocketmq源码学习-broker启动

本文详细探讨了RocketMQ Broker启动过程,包括创建brokerController、初始化messageStore、定时拉取nameSrv并注册心跳等步骤。在启动时,Broker主要负责接收Producer发送请求、Consumer读取消息及向NameServer注册心跳。通过分析源码,了解了启动过程中的关键操作和线程池的作用。

前言

这篇笔记记录broker启动的源码学习

broker主要完成一下几件事情:
1.接收producer的发送请求,并对消息进行持久化、同步其他节点
2.接收consumer读取消息星球
3.定时向nameSrv注册心跳信息,保持连接

在启动的时候,也是分了两个方法
1、创建brokerController
2、启动brokerController

createBrokerController

入口方法:org.apache.rocketmq.broker.BrokerStartup#main
在这里,我们先看创建brokerController的方法
org.apache.rocketmq.broker.BrokerStartup#createBrokerController

在这个方法中,会初始化brokerConfig、nettyServerConfig、nettyClientConfig,然后根绝配置文件中的配置信息,填充这几个配置信息,具体的细节,不再一一阐述,可以debug或者是追下源码看下

/**
 * 7.初始化BrokerController对象
 */
final BrokerController controller = new BrokerController(
    brokerConfig,
    nettyServerConfig,
    nettyClientConfig,
    messageStoreConfig);
// remember all configs to prevent discard
controller.getConfiguration().registerConfig(properties);

/**
 * 8.调用brokerController的初始化方法
 */
boolean initResult = controller.initialize();
if (!initResult) {
   
   
    controller.shutdown();
    System.exit(-3);
}

在创建brokerController之后,会调用其initialize()方法进行初始化。在这个初始化的方法中,总结来看,就做了两个事情:
1、加载消息文件到内存中:因为broker中负责持久化消息信息,所以在启动的时候,需要从磁盘文件上,加载消息到内存中
2、初始化了一大堆的线程池和定时线程池,暂时没有一一去看这些线程池是为了干什么

在这里插入图片描述

定时拉取所有的nameSrv,更新到内存中

在这一批的定时线程池中,有一个需要关注,就是下面截图中的这个,这个定时线程池要做的事情

  1. 通过http请求,从一个url请求的返回结果中,获取到所有nameSrv地址(http://jmenv.tbsite.net:8080/rocketmq/nsaddr); 为什么这个地址可以返回nameSrv地址信息,暂时还没有搞明白
  2. 让后更新所有的nameSrv地址信息到本地内存中的这个集合中namesrvAddrList
  3. 这里保存到本地内存中,broker在定时向所有nameSrv注册心跳信息时,会用到这个内存中的nameSrv地址

在这里插入图片描述

public String fetchNameServerAddr() {
   
   
    try {
   
   
        String addrs = this.topAddressing.fetchNSAddr();
        if (addrs != null) {
   
   
            if (!addrs.equals(this.nameSrvAddr)) {
   
   
                log.info("name server address changed, old: {} new: {}", this.nameSrvAddr, addrs);
                this.updateNameServerAddressList(addrs);
                this.nameSrvAddr = addrs;
                return nameSrvAddr;
            }
        }
    } catch (Exception e) {
   
   
        log.error("fetchNameServerAddr Exception", e);
    }
    return nameSrvAddr;
}

public String fetchNameServerAddr() {
   
   
    try {
   
   
        // 获取当前所有的nameSrv地址信息
### 如何启动 RocketMQ 源码 #### 准备工作 为了能够成功编译并启动 RocketMQ 源码,需要确保开发环境中已经安装了必要的工具和依赖项。这些包括但不限于 JDK、Maven 和 Git。 #### 获取源码 可以通过克隆官方 GitHub 仓库来获取最新的 RocketMQ 源码: ```bash git clone https://github.com/apache/rocketmq.git cd rocketmq ``` #### 编译项目 使用 Maven 来构建整个工程,建议采用 `-DskipTests` 参数跳过测试以加快编译速度: ```bash mvn -Prelease-all clean install -Dmaven.test.skip=true -U ``` 此过程会下载所需的所有依赖库并将它们打包成可执行 jar 文件[^1]。 #### 设置环境变量 编辑 `/etc/profile` 或者当前用户的 `.bashrc` 文件设置 `ROCKETMQ_HOME` 变量指向解压后的目录,并更新系统的 PATH 路径以便可以直接调用命令行工具: ```bash vim ~/.bashrc export ROCKETMQ_HOME=/path/to/your/unzipped/directory export PATH=${PATH}:${ROCKETMQ_HOME}/bin source ~/.bashrc ``` #### 初始化数据存储结构 创建用于保存消息日志和其他元数据的文件夹结构,具体如下所示: ```bash mkdir -p ${ROCKETMQ_HOME}/store/{commitlog,consumequeue,index} ``` #### 修改配置文件 根据实际需求调整 broker 配置文件中的各项参数,特别是当有多台机器组成集群时更要注意每台节点之间的差异化设定[^3]。 #### 启动 NameServer Name Server 是 RocketMQ 中非常重要的组件之一,负责管理 Topic 注册表以及路由信息查询等功能。可以利用以下指令开启单实例模式下的 namesrv 实例: ```bash nohup sh ${ROCKETMQ_HOME}/bin/mqnamesrv & tail -f ~/logs/rocketmqlogs/namesrv.log ``` #### 启动 Broker Broker 承担着接收生产者的发送请求并向消费者分发已订阅主题的消息的任务。对于初次使用者来说,默认情况下只需要启动一个 Master 即可满足基本的学习目的;而对于高可用性的场景,则可能还需要额外部署 Slave 角色形成主从架构。这里给出简单的 master-only 方式的启动方式: ```bash nohup sh ${ROCKETMQ_HOME}/bin/mqbroker -n localhost:9876 autoCreateTopicEnable=true & tail -f ~/logs/rocketmqlogs/broker.log ``` 上述命令中指定了 name server 地址为本地主机上的默认端口 (即localhost:9876),并且允许自动创建不存在的主题资源。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值