名称服务器是RocketMQ的注册中心,用于管理经纪人和路由信息。然后,我们提取一些问题来分析名称服务器的源代码:
我们开始使用上述问题分析名称服务器的源代码。
org.apache.rocketmq.namesrv.namesrvstartup是名称服务器的核心启动类,如下图所示:
MAIN0方法中的核心过程如下:
接下来,让我们分析namesRvController并启动namesRvController的源代码。
输入namesRvStartup#createNamesrvController方法。首先,namesRvConfig和NetTyServerConfig表示名称服务器和NetTyServer网络配置的配置,设置了监视端口9876。
您需要配置Rocket_home环境变量。如果没有配置
与加载日志有关的基本配置基于LogBack_namesrc.xml配置文件。
将namesrcconfig和nettyserverconfig作为参数传递到namesRcconTroller中,以创建namesRcconTroller。
如下图所示,查看名称rccontroller的构造函数:
它主要将其初始化为namesRvController的某些变量,我们将分析这些变量在将来的具体作用。
此时,namesRvController已完成创建,然后启动namesRvController。
上图是开始方法,该方法主要分为以下步骤:
我们主要分析第一个和第三步。
输入namesRvController的initialize()方法,如下图所示:
接下来,分析namesRvController的开始方法,如下图所示:
概括:
知道namesRvController是名称服务器的核心组成部分,我们将重点关注namesRvController和这些变量变量的特定效果。
这是两个核心变量RouteInfomanager和Remotingserver,RouteInfomanager存储路由信息,semotingserver用于通信网络通信。我们将主要分析RouteInfomanager路线管理组件。
输入RouteInfomanager类。在此类下方,包含一个读写锁和五个哈希图数据结构,如下图所示:
Queuedata包含经纪人的名称,代表多个制动器的主题下的队列,因此RocketMQ的新闻实现了分布式存储。
readqueuenums:排队数量用于制作消费者数据的路线。
Writequeuenums:编写的队列数是为了编写路由的路线
例如,经纪人的readqueuenums设置为4,Writequeuenums设置为4,生产商随机选择一个队列以从4个写队列中写入。消费者从4个读取队列中随机获得数据消耗的队列。
如果WriteQueuenums设置为4,并且将ReadQueuenums设置为2,则数据将均匀地写入4个写入队列中,但是数据读取仅读取2个写入队列数据。
如果Writequeuenums设置为4,并且将ReadQueuenums设置为8,则数据将写入4个写线队列。消费将从8个队列中获得,但只有4个队列具有数据。
该设计的目的实际上是为了促进扩张和收缩的运行。例如,我们的readqueuenums和writequeuenums为8。如果要收缩,则可以首先减少4个写入,然后等待读取数据以读取数据。然后将读取到4。
使用权限,是否可以读取/写入权限。
BrokerData包含群集名称群集,经纪人名称Brokername,群集地址BROKERADDRS.BROKERADDRS存储BrokerId与经纪人Master的地址之间的关系,其余的就是经纪人主人的地址。
经纪人会定期向名称服务器发送心跳,以更新此BrokerLiveInfo的数据结构,以维持心跳信息。Nameserver的心跳检测也是检测信息。
根据上面的数据结构,假设我们现在有两个经纪人群,由两个大师和两个,如下图所示:
集群为C1,但分为两个经纪人集群:经纪人A和经纪人B,分为两个大师和两个。
查看相应名称服务器(主题表演和BrokerAddrtable数据结构)下方的数据结构:
BrokerLivetable和Cluserableddrable数据结构:
一个主题可以对应于多个经纪人。集群下有多个经纪人。每个经纪人下都有一个主要关系。每个节点都需要维护心跳信息。
在分析了名称服务器路由信息存储的数据结构之后,让我们看一下如何注册经纪人的注册,经纪人的离线,经纪人路由信息获取和经纪人正时扫描的过程。
RouteInfomanager#registerBroker()方法要注册经纪人,如下图所示:
接下来,让我们分析注册过程:
让我们总结经纪人注册的过程:
