整体模块
image.png按照rocketmq的设计,broker是专门存储queue、topic的对象关系的,而这些存储需要一个中心化的信息中心,也就是namesrv了,所以我们可以分为两个模块去了解。
namesrv,其实就是相当于一个注册中心,他是AP系统也好CP系统也好,他在MQ整体的一个作用就是充当“分诊台”。比如,我要找XXX topic的queue它在哪台ip上,等等的作用。
broker,属于消息存储的核心模块,它负责消息的接收,处理,存储和下发。接收端采用netty高性能地处理消息,存储使用高可用的write ahead logging,使用日志先行的方式保证消息的不丢失。
我们来梳理一下这个中间件的入口代码。
启动类
org.apache.rocketmq.broker.BrokerStartup#main
这个启动类,有两个过程,一个是读取配置创建BrokerController,另一个是把其中配置好的线程池啊,netty服务端这些给启动了。
public static void main(String[] args) {
start(createBrokerController(args));
}
启动流程图
rocketmq启动流程.png源码细节
image.png image.png image.png image.png image.png由上述图片可知,通过RemotingCommand来区分传过来的code走哪个processor,看到send message大部分的handler是org.apache.rocketmq.broker.processor.SendMessageProcessor,
因此debug的入口就是这个类的processRequest方法。
整体可以归纳为,加载配置,创建各种处理线程池,以及netty服务端,并且把handler加入到netty的处理队列中,最后把这些服务都启动。
下一步要深入地去看SendMessageProcessor,就可以看出不同的处理消息的逻辑,以及commitLog的逻辑了。
网友评论