首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RocketMQ篇8:NameServer源码解析

模块入口代码功能

NamesrvStartup是模块的启动入口,NamesrvController是用来协调各个调用模块功能的代码。

1、解析命令行参数

main0函数主要完成两个功能,第一个功能是解析命令行参数;

-c命令行参数是指定配置文件的位置

-p命令行参数是用来打印所有配置项的值。

2、初始化NameServer的Controller

main0函数的另一个功能是初始化Controller。

根据解析出的配置参数,调用controller.initialize()来初始化,然后调用controller.start()让NameServer开发服务。

还有一个逻辑是注册ShutdonwHookThread,当程序退出的时候回调用controller.shutdonw来做退出前的清理工作。

NameServer的总控逻辑

NameServer的总控逻辑在NamesrvController中,是集群的协调者,它只是简单地接受其他角色报上来的状态,然后根据请求返回响应的状态。

1、线程池初始化

启动了一个默认8个线程的线程池,还有两个定时执行的线程,一个用来扫描失效的Broker,另一个用来打印配置信息。

2、启动通信服务,关联初始化的线程池

启动负责通信的服务remotingServer,监听一些端口,收到Broker、Client等发过来的请求后,根据请求的命令,调用不同的Processor来处理。这些不同的处理逻辑被放到上面初始化的线程池中执行。

核心业务逻辑处理

NameServer的核心业务逻辑,在DefaultRequestProcessor中。网络通信服务模块收到请求后,就调用这个Processor来代理。

根据RequestCode调用不同的函数来处理,如:REGISTER_BROKER是集群中新加入一个Broker;GET_ROUTEINFO_BY_TOPIC是请求获取一个Topic的路由信息;WIPE_WRITE_PERM_OF_BROKER是删除一个Broker的写权限。

集群状态存储

NameServer作为集群的协调者,需要保存和维护集群的各种元数据,是通过RouteInfoManager类来实现的。

每个结构存储着一类集群信息,具体请看我之前发布的文章:《RocketMQ篇3:分布式消息队列的协调者》中的集群状态的存储结构

因为在NameServer的场景中,读取操作多,更改操作少。RouteManager中使用的是可重入的读写锁(ReentrantReadWriteLock)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200516A0NW1W00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券