[ RocketMQ源码阅读 3 ] NameServer

启动过程

NameServer模块下的代码结构,项目启动类为NamesrvStartup。启动过程主要做了如下几件事情。

  1. 读取配置文件和命令行参数
  2. 初始化并启动netty服务端和netty客户端
  3. 初始化并启动NamesrvController,注册processor,提供对外接口

代码目录结构

NameServer代码结构

对外接口

processor目录下则为主要的对外接口。通过梳理NameServer的接口,以了解更多的功能细节。
注册对外接口

ClientRequestProcessor

接口名称 接口功能
GET_ROUTEINFO_BY_TOPIC 按照topic名称获取路由信息

DefaultRequestProcessor

接口名称 接口功能
PUT_KV_CONFIG 修改kv配置
GET_KV_CONFIG 获取kv配置
DELETE_KV_CONFIG 删除kv配置
GET_KVLIST_BY_NAMESPACE 获取某个namespace的kv配置
QUERY_DATA_VERSION 获取缓存的broker元数据版本信息,并通过版本号判断数据是否有变化
REGISTER_BROKER broker注册
UNREGISTER_BROKER broker注销
BROKER_HEARTBEAT broker心跳
GET_BROKER_MEMBER_GROUP 按照clusterName和brokerName获取所有注册信息
GET_BROKER_CLUSTER_INFO 获取所有broker注册信息
WIPE_WRITE_PERM_OF_BROKER 关闭某个broker的写操作
ADD_WRITE_PERM_OF_BROKER 打开某个broker的写操作
GET_ALL_TOPIC_LIST_FROM_NAMESERVER 获取所有topic列表
DELETE_TOPIC_IN_NAMESRV 删除topic
REGISTER_TOPIC_IN_NAMESRV 注册topic
GET_TOPICS_BY_CLUSTER 获取某个cluster下的所有topic列表
GET_SYSTEM_TOPIC_LIST_FROM_NS 获取系统topic列表
GET_UNIT_TOPIC_LIST 获取unit topic列表
GET_HAS_UNIT_SUB_TOPIC_LIST
GET_HAS_UNIT_SUB_UNUNIT_TOPIC_LIST
GET_NAMESRV_CONFIG 读取NameServer所有的配置
UPDATE_NAMESRV_CONFIG 更新NameServer的配置

通过这些api能大致了解到NameServer部分核心功能。NameServer主要的作用是开辟了一些内存空间,用于存放Topic与Broker的元数据信息。

核心组件

  1. NamesrvController
    提供对外接口,心跳检查Broker注册信息是否过期
  2. RouteInfoManager
    缓存topic、broker、queue的路由信息

队列水位

NamesrvController存在两个队列defaultThreadPoolQueueclientRequestThreadPoolQueue,后台会定时打印这两个队列的长度和消费延迟时间。

队列 默认容量 功能
defaultThreadPoolQueue 10000 执行对于DefaultRequestProcessor的请求
clientRequestThreadPoolQueue 50000 执行对于ClientRequestProcessor的请求

一些观察结果

  1. 4.0和5.0都Broker选主机制是有差别的,4.0没有使用Raft协议进行选主,5.0则是采用了Raft协议
  2. NamesrvController会定期检查Broker注册信息是否过期,超过120s未收到Broker的心跳,就会注销Broker