美文网首页
RocketMQ-NameServer

RocketMQ-NameServer

作者: big兵 | 来源:发表于2018-03-05 16:35 被阅读0次

    NameServer是什么?

    NameServer的主要功能是为整个MQ集群提供服务协调与治理,具体就是记录维护Topic、Broker的信息,及监控Broker的运行状态。为client提供路由能力(具体实现和zk有区别,NameServer是没有leader和follower区别的,不进行数据同步,通过Broker轮训修改信息)。

    看下阿里中间件团队对NameServer特点总结:

    Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。

    Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。

    Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。

    Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。

    NameServer代码结构

    如下图:

    代码结构

    如上图所示,nameServer设计比较轻量级的,其中几个主要类的功能为:

    NamesrvStartup:从命名就可以看出这为NameServer的启动类。

    RouteInfoManager:从类名可以看出为路由信息的管理类,就是存放Broker的状态信息及Topic于Broker的关联关系。如下截图:

    DefaultRequestProcessor:类名可看出为处理请求的类,里面封装了对broker发来的各种请求的响应。

    NamesrvController:NameServer控制类,管控NameServer的启动、初始化、停止等生命周期。

    先看下NamesrvStartup的代码,简要的抽取几点:

    final NamesrvConfig namesrvConfig = new NamesrvConfig();

    final NettyServerConfig nettyServerConfig = new NettyServerConfig();

    nettyServerConfig.setListenPort(9876);

    。。。。。。。。。。。。。

    final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig);

    controller.getConfiguration().registerConfig(properties);

    boolean initResult = controller.initialize();

    可以看出NameServer启动时候,初始化了nameServer和netty的配置(可以看出RocketMQ各部分之间的通信使用的netty),并初始化了NameserController。

    看下initialize()方法

    可以看出初始化了nettyServer,初始化了线程池,注册了请求处理类。

    我们先看下broker的注册,在DefaultRequestProcessor类中

    监听到register请求后,调用注册请求方法

    上图可以看出为了避免线程安全问题,使用了lock锁。注册过程就是维护RouteInfoManager中的数据结构。

    注册broker成功后,就是通过心跳来检测broker的生命周期,维护broker状态信息。

    从boolean initResult = controller.initialize();方法中可以看到这一块代码:

    图一为初始化调度线程池(单线程),图二初始化后启动调度线程,图三可以看出,调度线程定时的扫描brokerLiveTable里面broker的状态信息,发现最近的更新时间与当前时间相差大于BROKER_CHANNEL_EXPIRED_TIME =1000 *60 *2,即两分钟的话,就删除当前broker,从图四可以看出,删除broker就是删除RouteInfoManager中维护的几个hashmap中关于broker的信息。

    NameServer就解析到这里,如果感兴趣,大家不妨看下源码,自己跟下。

    相关文章

      网友评论

          本文标题:RocketMQ-NameServer

          本文链接:https://www.haomeiwen.com/subject/uaknxftx.html