rocketmq源码学习-broker启动

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

前言

这篇笔记记录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 {
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值