文章目录
NameServer作用
在介绍NameServer前,先看下官方的RocketMQ架构图
NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能
- Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;
- 路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费
NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer,Consumer仍然可以动态感知Broker的路由的信息
NameServer实例时间互不通信,这本身也是其设计亮点之一,即允许不同NameServer之间数据不同步(像Zookeeper那样保证各节点数据强一致性会带来额外的性能消耗)
本文会从源码角度重点分析NameServer的启动流程
下篇文章会主要分析NameServer对broker数据的管理,以及路由机制
NameServer启动
先给出NameServer启动的时序图,方便大家跟踪流程
NameServer配置加载
时序图第一步加载配置文件对应源代码在org.apache.rocketmq.namesrv.NamesrvStartup#main0方法中
从NamesrvConfig,NettyServerConfig中加载配置文件代码在createNamesrvController方法中,看下具体实现
与配置相关的两个类为NamesrvConfig和NettyServerConfig
NamesrvConfig中属性如下
//rocketmqHome路径
private String rocketmqHome = S