天天看点

47. 源代码解读-RocketMQ-broker

nohup sh bin/mqbroker -n localhost:9876 &

启动BrokerStartup类

main函数里面比较简单,创建了一个BrokerController,然后调用start方法,那我们先看下createBrokerController构造一个Controller

这个方法有点复杂,可以一步步讲。

首先会初始化NettyServerConfig和NettyClientConfig,因为Broker在运行的时候既是Netty客户端,又是Netty服务端。也就是既要响应别人的请求,同时又会请求其他服务,比如Namesrv。

然后把监听端口设置成10911(broker启动后用ps 和netstat 看一下就可以看到Broker运行的进程与监听端口,如下图)

lsof -iTCP -sTCP:LISTEN -nP (mac环境)

ps -ef | grep broker

47. 源代码解读-RocketMQ-broker

判断是否有-c参数,如果有-c参数,后面一般带的是Broker启动脚本文件,那么就可以解析Broker启动配置文件

如果单机玩demo的话,可以用-n参数,也就是直接指定Namesrv,也就是用如下启动脚本

这个方法有点复杂,new大家可以自己看,就是new出一系列的相关对象,直接看controller.initialize()方法。

BrokerController.java

initialize方法首先会去load各种之前的参数,我们可以挨个看一下每个load分别对应哪个文件。

topicConfigManager.load()

首先它会得到config文件路径,一般默认是在根目录/store/config,比如我的是

/Users/huangrongwei/store/config

可以进去看一下,如下图:

47. 源代码解读-RocketMQ-broker

每个种类有两个文件,一个正常的,一个备份的;那我们加载的顺序就是先加载正常的,如果不存在或者出错,那么就尝试加载备份的文件。

加载的时候执行decode()方法

decode方法

很明显,decode是抽象方法,它的实现类如下:

47. 源代码解读-RocketMQ-broker

很明显,它对应了上面2.3.2.6步几个load方法,这种应该是模版设计模式吧(父类定义了执行流程,子类实现细节)。

那我们先看topicConfigManager.decode,它对应的文件是topics.json

其实就是解析里面的内容,把topic的配置信息放到topicConfigTable里面,然后记录一下数据版本(如果topic数据有变化,版本会递增,Namesrv会根据版本号来决定要不要更新它的数据。)

那一个topic一般有什么配置呢?可以看下topics.json,如下图:

47. 源代码解读-RocketMQ-broker

大概解释下里面的参数queueNumber表示队列数,一个topic可以有多个队列,每个消费者可能从不同的队列去拿消息,当然生产者的消息也可能丢到一个topic的不同队列中。

其他参数大家可以去细看。

其他几个decode原理类似,大家可以自己看下代码。

为什么叫做vip通道呢?因为rocketmq监听的这个端口的消息少一点,特别是存储消息到磁盘的那块逻辑,vip通道是不会做的。所以个人觉得这个通道响应速度会快点。

这一点从下面的registerProcessor()方法可以看的出来。

vip通道少了RequestCode.PULL_MESSAGE这个事件,所以可以冒昧的猜测,RequestCode.PULL_MESSAGE有可能是一个耗时的操作。

另外,有些broker可能没有开这个vip通道,那么就需要在生产者或者消费者手动关闭这个通道。

这里包括

每天凌晨记录一次昨天收发了多少消息

定时持久化消费进度

持久化comsumer fileter,这些都是开始load的那些文档关联的。

定时清理消费太慢的消费者,以保护Broker

打印发送消费线程运行状态

打印分发消息比接收消息延迟多少。

定时获取Namesrv地址

如果当前broker是slave,那么定时从master同步消息;如果是master,那么定时打印slave和master差别。

到这里,createBrokerController方法就分析完了。 总之,经过这个方法之后:

和其他服务的通信管道建立了。

之前存储的数据恢复了(topic, 消费进度,存储的消息)。

启动了各种定时器,用来维护Broker的正常工作。

如果是slave,那么就定时从master同步数据

总之,所有的都准备好了。

BrokerController创建完了之后,start就比较简单了,把创建的各种服务start起来。同时向所有的Namesrv注册自己。

还要启动定时器,定时向所有的Namesrv注册自己,告诉Namesrv自己还活着,这样消息生产者和消费者就可以通过Namesrv找到自己。

至此,Broker启动流程分析结束。

     本文转自rongwei84n 51CTO博客,原文链接:http://blog.51cto.com/483181/2043964,如需转载请自行联系原作者