rocketMQ nameSrv原理解析

  • Post author:
  • Post category:其他


rocketMQ nameSrv(RocketMQ的注册中心)

RocketMQ的注册中心nameSrv在rocketMQ中相当于zookeeper在dubbo中的作用,是用来存储broke和client的注册信息的。

broke和clicent在启动的时候都会去连接nameSrv获取信息,下面介绍一下nameSrv的运行机制

这里写图片描述

nameSrv启动时入口NamesrvStartup会实例化NamesrvController,然后调用其initialize()方法。

NamesrvController使nameSrv的核心类,他有如下操作:

  • 初始化配置信息 KVConfigManager、NettyServerConfig
private String kvConfigPath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "kvConfig.json";
    private String configStorePath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "namesrv.properties";
  • 初始化通信层
  • 初始化线程池

    **

nameSrv分布式实现

**

在分布式主从和单机情况下使用不同的Processor

if (namesrvConfig.isClusterTest()) {
this.remotingServer.registerDefaultProcessor(new ClusterTestRequestProcessor(this, namesrvConfig.getProductEnvName()),
                this.remotingExecutor);
        } else {
this.remotingServer.registerDefaultProcessor(new DefaultRequestProcessor(this), this.remotingExecutor);
        }

ClusterTestRequestProcessor继承DefaultRequestProcessor,仅重写了

getRouteInfoByTopic()方法。

在重写的方法中仅加入了一行代码

topicRouteData = adminExt.examineTopicRouteInfo(requestHeader.getTopic());

就是在本机上获取不到topic的信息会尝试去其他的namesvr上获取。

跟入代码会发现最终是调用了NettyRemotingClient.invokeSync(),

NettyRemotingClient中的namesrvAddrList 存储着所有的namesrv的地址

private final AtomicReference<List<String>> namesrvAddrList = new AtomicReference<List<String>>();



版权声明:本文为wangxiaofeng1124原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。