前言
最近看了下rocketmq的源码,计划针对最近的学习,做一个笔记,先从nameServer启动的逻辑开始记录吧
在rocketmq中,有四个关键的组件
- nameServer
- broker
- producer
- consumer
这四个组件之间的关系是这样的
关于nameSrv
nameserver的作用是:提供类似于注册中心的功能,基于这个前提,我们可以知道,rocketmq需要提供读写的功能,因为在mq中,组件之间的通信是通过netty完成的,所以,nameserver只需要提供nettyServer即可
在nameSrv中,提供了两个功能:
1、broker在启动的时候,会将自己的信息注册到nameSrv中;
2、producer在向topic中发送消息的时候,consumer在去broker中拉取消息的时候,会先去nameSrv上找对应的topic信息,所以这是nameSrv的两大功能
接着我们来看nameSrv启动的源码
启动源码
nameSrv启动的入口是在:org.apache.rocketmq.namesrv.NamesrvStartup#main 从启动脚本中可以证明这个点
NamesrvController controller = createNamesrvController(args);
start(controller);
在nameSrv启动的入口处,有两行代码是需要关注的
代码1:初始化NamesrvController对象,这里主要是解析配置文件、控制台配置信息,根据配置信息,初始化nettyServerConfig和NameSrvConfig;然后根据这两个config对象,初始化namesrvController对象
代码2:初始化nameSrv
代码1的逻辑,没有什么特别重要的,就是解析配置文件的逻辑,来看代码2:
public static NamesrvController start(final NamesrvController controller) throws Exception {
if (null == controller) {
throw new IllegalArgumentException("NamesrvController is null");
}
/**
* 1.初始化了几个定时任务
*/
boolean initResult = controller.initialize();
if (!initResult) {
controller.shutdown();
System.exit(-3);
}
/**
* 2.这里应该是一个钩子方法,在关闭nameserver的时候会被调用
*/
Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(log, new Callable<Void>() {
@Override
public Void call() throws Exception {
controller.shutdown();
return null;
}
}));
// 3.启动nettyServer,也就是namesrv启动,可以接收客户端的请求(这里的客户端 = 服务发送者和服务消息者)
controller.start();
return controller;
}
在这个方法中,标注了三个关键点:
在第一个方法中,其中有一个定时任务,需要关注
// 这个任务,每10S执行一次
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
NamesrvController.this.routeInfoManager.scanNotActiveBroker();
}
}, 5, 10, TimeUnit.SECONDS);
public void scanNotActiveBroker() {
// nameSrv在内存中存储的broker信息
Iterator<Entry<String, BrokerLiveInfo>> it = this.<