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.<
RocketMQ NameServerRocketMQ 的一个核心组件,主要负责管理 RocketMQ 集群中的各个 Broker 节点的信息,包括 Broker 的名称、IP 地址、状态等信息。在 RocketMQ 集群中,所有的 Broker 都需要向 NameServer 注册,以便 NameServer 能够掌握整个集群的状态信息。 RocketMQ NameServer源码位于 `rocketmq-namesrv` 模块中,其主要实现了以下功能: 1. 启动时加载配置文件,包括监听端口、存储路径、集群名称等信息; 2. 处理 Broker 节点的注册、注销请求,维护 Broker 节点的状态信息; 3. 处理 Consumer 节点的心跳请求,维护 Consumer 节点的状态信息; 4. 处理 Topic 的创建、删除请求,维护 Topic 的状态信息; 5. 提供查询 Broker 节点、Topic 等信息的接口。 RocketMQ NameServer 的核心类是 `NamesrvController`,它继承了 Netty 的 `NettyRemotingServer` 类,并实现了 `RequestProcessor` 接口,用于处理来自 Broker 和 Consumer 节点的请求。在 `NamesrvController` 中,还包含了 `RouteInfoManager`、`BrokerHousekeepingService`、`KVConfigManager` 等组件,用于维护集群状态信息和管理配置文件RocketMQ NameServer 的启动入口是 `main` 方法,它会加载配置文件并启动 `NamesrvController`。启动后,NameServer 会监听指定端口,等待来自 Broker 和 Consumer 节点的请求,并根据请求类型调用相应的处理方法进行处理。 总之,RocketMQ NameServer 的主要作用是管理整个 RocketMQ 集群的状态信息,确保集群中各个节点的状态始终保持同步。其源码实现比较复杂,需要深入理解 RocketMQ 的设计思想和架构原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值