当前位置: 首页 > 网络应用技术

RocketMQ源代码(1)名称服务器启动过程和存储结构的分析

时间:2023-03-07 17:21:23 网络应用技术

  名称服务器是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()方法要注册经纪人,如下图所示:

  接下来,让我们分析注册过程:

  让我们总结经纪人注册的过程: