rocketmq源码学习-nameServer

本文详细介绍了RocketMQ中nameServer的角色和功能,包括作为注册中心的作用,以及启动源码分析。重点讲解了nameServer启动过程中的关键步骤,如初始化NamesrvController、启动nettyServer,并探讨了broker注册到nameServer的逻辑,以及nameServer如何处理broker的注册请求。
摘要由CSDN通过智能技术生成

前言

最近看了下rocketmq的源码,计划针对最近的学习,做一个笔记,先从nameServer启动的逻辑开始记录吧

在rocketmq中,有四个关键的组件

  1. nameServer
  2. broker
  3. producer
  4. consumer

这四个组件之间的关系是这样的
在这里插入图片描述

关于nameSrv

nameserver的作用是:提供类似于注册中心的功能,基于这个前提,我们可以知道,rocketmq需要提供读写的功能,因为在mq中,组件之间的通信是通过netty完成的,所以,nameserver只需要提供nettyServer即可

在nameSrv中,提供了两个功能:
1、broker在启动的时候,会将自己的信息注册到nameSrv中;
2、producer在向topic中发送消息的时候,consumer在去broker中拉取消息的时候,会先去nameSrv上找对应的topic信息,所以这是nameSrv的两大功能

接着我们来看nameSrv启动的源码

启动源码

nameSrv启动的入口是在:org.apache.rocketmq.namesrv.NamesrvStartup#main 从启动脚本中可以证明这个点

NamesrvController controller = createNamesrvController(args);
start(controller);

在nameSrv启动的入口处,有两行代码是需要关注的

代码1:初始化NamesrvController对象,这里主要是解析配置文件、控制台配置信息,根据配置信息,初始化nettyServerConfig和NameSrvConfig;然后根据这两个config对象,初始化namesrvController对象

代码2:初始化nameSrv

代码1的逻辑,没有什么特别重要的,就是解析配置文件的逻辑,来看代码2:

public static NamesrvController start(final NamesrvController controller) throws Exception {
   

    if (null == controller) {
   
        throw new IllegalArgumentException("NamesrvController is null");
    }
    /**
     * 1.初始化了几个定时任务
     */
    boolean initResult = controller.initialize();
    if (!initResult) {
   
        controller.shutdown();
        System.exit(-3);
    }

    /**
     * 2.这里应该是一个钩子方法,在关闭nameserver的时候会被调用
     */
    Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(log, new Callable<Void>() {
   
        @Override
        public Void call() throws Exception {
   
            controller.shutdown();
            return null;
        }
    }));

    // 3.启动nettyServer,也就是namesrv启动,可以接收客户端的请求(这里的客户端 = 服务发送者和服务消息者)
    controller.start();
    return controller;
}

在这个方法中,标注了三个关键点:
在第一个方法中,其中有一个定时任务,需要关注

// 这个任务,每10S执行一次
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
   
   @Override
       public void run() {
   
           NamesrvController.this.routeInfoManager.scanNotActiveBroker();
       }
   }, 5, 10, TimeUnit.SECONDS);

public void scanNotActiveBroker() {
   
    // nameSrv在内存中存储的broker信息
    Iterator<Entry<String, BrokerLiveInfo>> it = this.<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值