RocketMQ源码分析(二)先从注册中心开始说起
namesrv,相当于RocketMQ的服务注册中心(路由发现),大家通过结构图就可以看的明白:
image我们先从启动类NamesrvStartup说起,在其中的main0方法里,它会先去创建一个NamesrvController,然后调用start方法把创建的controller传入进去进行启动。
在createNamesrvController中,会获取一些启动参数(命令行参数),需要注意的是,这里有个类叫MixAll,大家可以把它当成是一个放各种常量和工具的混合类……
即参数填充NameServerConfig和NettyServerConfig,它两又被当成NamesrvController的参数传递进去创建了NamesrvController,最终通过start(NamesrvController)这个方法进行启动,这就是大概的一个流程。
接卸来我们分析一下NamesrvController这个类,它的成员变量中除了我们刚才说的那两个参数,还有很多参数,这里不一一分析,我们这里挑几个比较关键的来讲:
/**
* NameServer 定时任务执行线程池
*/
private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl(
"NSScheduledThread"));
/**
* 读取或变更NameServer的配置属性,加载 NamesrvConfig 中配置的配置文件到内存,
* 该类使用了ReentrantReadWriteLock结合对资源读写进行保护。尽最大程度提高线程的并发度。
*/
private final KVConfigManager kvConfigManager;
/**
* NameServer 数据的载体,记录 Broker、Topic 等信息。
*/
private final RouteInfoManager routeInfoManager;
1. scheduledExecutorService的作用有两个(初始化方法里有写)
1. 每10秒扫描一次broker,移除不激活状态的broker。
2. 每隔10分钟打印一次kv配置。
2. KVConfigManager没啥好说的,里面都是namesrv的一些配置。
3. RouteInfoManager,这个就比较关键了,掌握了broker和topic等等等的信息。
值得一提的是,里面有个类叫BrokerLiveInfo,是用来记录broker心跳存活信息的。
以下是我从源码里得到的一些信息点:
Broker 启动时,会向集群中所有的 NameSever发送心跳语句,每隔30s向集群中所有 NameServer 发送心跳包, NameServer收到Broker心跳包时会更新 brokerLiveTable缓存中 BrokerLivelnfo 的lastUpdateTimestamp ,然后 Name Server 每隔 10s 扫描 brokerLiveTable ,如果连续120s没有收到心跳包, NameServer 将移除该Broker的路由信息,同时关闭 Socket 连接 。
路由发现这一块,nameserver是不会主动推给客户端的,客户端需要一些broker地址和topic信息,要自己去查。
nameserver集群这一块,通过源码可以看出,它们之间不会互相同步数据,各管各的,这点和我们常规的服务注册中心还是有区别的。