(二)RocketMQ源码分析之组件NameServer的路由信息结构

  • 概述
    RocketMQ这个消息中间件是由多个组件组成的,这样做的目的就是为了更好的解耦,各个组件各司其职,这样也有利于整个框架的维护和升级。其中之一就是NameServer,这个组件的作用主要起到一个服务注册和发现的功能,而管理的服务就是Broker组件,每个Broker启动都要注册到NameServer,利用心跳检查来踢出不可用的Broker,每个组件都是一个独立的服务,NameServer作为一个服务管理者,各个组件(broker,producer,consumer)交互都要经过它也起到了各个组件解耦作用。

  • 模块结构
    在这里插入图片描述

  • NamesrvStartup
    在这里插入图片描述
    1.首先调用createNamesrvController方法,这个方法主要就是创建NamesrvController,然后就是解析命令行,根据命令行设置一些启动配置
    2.start方法主要就是使用NamesrvController对象来真正做一些主要启动流程控制的事了,首先对NamesrvController做一些初始化,然后启动,这些逻辑我们需要看看NamesrvControlle

  • NamesrvController
    在这里插入图片描述
    这个方法是NamesrvStartup的start方法,这个方法控制了启动流程,但是真正做一些启动初始化主要逻辑还是调用NamesrvController的方法来处理
    在这里插入图片描述
    在初始化主要做了两件事。第一是初始化了netty需要的配置,这样方便下一步真正启动服务;第二是开启一个broker心跳检查的一个定时任务,broker每隔30秒钟向nameserver进行报告,nameserver收到报告就跟新一下broker报告的最后跟新时间,如果两分钟之内某个broker没有来报告,那么将会被剔除。
    在这里插入图片描述
    NamesrvController的start方法就是根据刚刚初始化的remotingServer对象启动一个服务端的socket,也就是真正启动服务

  • RouteInfoManager
    在这里插入图片描述
    这里我们来看一下NameServer的核心,那就是路由信息是如何管理的,这也是我们最关心的一块,还记得我自己加了一个定时任务吗?哪个定时任务就是调用RouteInfoManager的printAllPeriodically方法,这样方便我们查看路由信息的变化情况

2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable SIZE: 11
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: RMQ_SYS_TRANS_HALF_TOPIC [QueueData [brokerName=broker-b, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0], QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: %RETRY%please_rename_unique_group_name [QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: TopicTest [QueueData [brokerName=broker-b, readQueueNums=4, writeQueueNums=4, perm=6, topicSynFlag=0], QueueData [brokerName=broker-a, readQueueNums=4, writeQueueNums=4, perm=6, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: broker-b [QueueData [brokerName=broker-b, readQueueNums=1, writeQueueNums=1, perm=7, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: broker-a [QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=7, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: SELF_TEST_TOPIC [QueueData [brokerName=broker-b, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0], QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: TBW102 [QueueData [brokerName=broker-b, readQueueNums=8, writeQueueNums=8, perm=7, topicSynFlag=0], QueueData [brokerName=broker-a, readQueueNums=8, writeQueueNums=8, perm=7, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: BenchmarkTest [QueueData [brokerName=broker-b, readQueueNums=1024, writeQueueNums=1024, perm=6, topicSynFlag=0], QueueData [brokerName=broker-a, readQueueNums=1024, writeQueueNums=1024, perm=6, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: DefaultCluster [QueueData [brokerName=broker-b, readQueueNums=16, writeQueueNums=16, perm=7, topicSynFlag=0], QueueData [brokerName=broker-a, readQueueNums=16, writeQueueNums=16, perm=7, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: DefaultCluster_REPLY_TOPIC [QueueData [brokerName=broker-b, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0], QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - topicQueueTable Topic: OFFSET_MOVED_EVENT [QueueData [brokerName=broker-b, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0], QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]]
2020-02-06 17:41:28 INFO NSScheduledThread1 - brokerAddrTable SIZE: 2
2020-02-06 17:41:28 INFO NSScheduledThread1 - brokerAddrTable brokerName: broker-b BrokerData [brokerName=broker-b, brokerAddrs={0=192.168.0.107:11911}]
2020-02-06 17:41:28 INFO NSScheduledThread1 - brokerAddrTable brokerName: broker-a BrokerData [brokerName=broker-a, brokerAddrs={0=192.168.0.107:10911}]
2020-02-06 17:41:28 INFO NSScheduledThread1 - brokerLiveTable SIZE: 2
2020-02-06 17:41:28 INFO NSScheduledThread1 - brokerLiveTable brokerAddr: 192.168.0.107:11911 BrokerLiveInfo [lastUpdateTimestamp=1580982080445, dataVersion=DataVersion[timestamp=1580978657136, counter=2], channel=[id: 0xac63dc33, L:/127.0.0.1:9876 - R:/127.0.0.1:52152], haServerAddr=192.168.0.107:11912]
2020-02-06 17:41:28 INFO NSScheduledThread1 - brokerLiveTable brokerAddr: 192.168.0.107:10911 BrokerLiveInfo [lastUpdateTimestamp=1580982082613, dataVersion=DataVersion[timestamp=1580978657141, counter=4], channel=[id: 0x4d8c6c9f, L:/127.0.0.1:9876 - R:/127.0.0.1:52156], haServerAddr=192.168.0.107:10912]
2020-02-06 17:41:28 INFO NSScheduledThread1 - clusterAddrTable SIZE: 1
2020-02-06 17:41:28 INFO NSScheduledThread1 - clusterAddrTable clusterName: DefaultCluster [broker-b, broker-a]
2020-02-06 17:41:30 INFO NettyServerCodecThread_2

这个日志是我加的那段定时任务的代码执行结果,这样方便我们分析路由存储结构,我启动了两个master的broker,分别为broker-a, broker-b
a.topicQueueTable
这个存储了一个topic在哪些broker上有多少个读写队列,方便我们查看topic的队列分布情况,从日志看,我们目前是有10个topic,然后每个topic在各个broker分布的队列情况也看得出来,其实我们也可以通过界面工具来查看,对照是否一致,如下:
在这里插入图片描述
b.brokerAddrTable
这个主要存储broker的集群中,broker的名称以及broker的对应服务地址,可以参考日志信息和图形工具对照看一下
在这里插入图片描述
c.clusterAddrTable
这个存储,某个集群中,又哪些broker注册上来了,一般情况下,我们就一个集群
在这里插入图片描述
d.brokerLiveTable
这个用来管理某个broker的心跳检测信息的,NameServer就是通过遍历这个map来进行broker的检测和剔除的
在这里插入图片描述

发布了65 篇原创文章 · 获赞 11 · 访问量 7133

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/104189299