RocketMQ整体物理架构如下:
Broker服务器主要负责消息的存储、投递和查询以及服务高可用保证,为了实现这些功能,Broker包含了以下几个重要子模块
1.消息的存储(MessageStore): broker服务器最核心的功能就是消息的存储,需要保障消息存储的可靠性,以及写入、读取消息的效率。
2.请求处理器(Processor): broker服务器提供了消息发送、消息拉取、消息查询、事务消息等处理器,这些处理器封装并展示了broker对外提供能力。
3.定时调度服务(scheduleAtFixedRate):这些定时调度服务方便统计和维护broker服务的各种状态。
4.HA高可用服务(HAservice): 用于主从同步的服务,从broker服务向主broker服务拉取未同步的消息。
本篇主要以源码解析的形式,展开介绍一下Broker服务的初始化以及启动,可以清晰的了解到broker在初始化的过程中加载的资源以及各个功能模块是如何展开的。
BroekrStartup做为执行命令行启动脚本调用的入口类,执行其main方法,调用createBrokerController,创建之。
createBrokerController这个方法代码量较大,主要目标就是创建BrokerController对象,在创建BrokerController对象之前加载和创建了其依赖的一系列对象。
主要涉及的内容为:
1.解析命令行启动参数以及配置文件,初始化创建BrokerConfig、NettyServerConfig、NettyClientConfig、MessageStoreConfig对象
2.校验NamesrvAddr地址的正确性
3.主从节点的设置以及HA监听端口
4.调用initialize方法进行broker的初始化
5.注册JVM钩子函数,在JVM退出时,关闭涉及到的各种资源
createBrokerController这个方法结束之后,BrokerController对象已经创建完毕了,通过BrokerController对象的构造函数,可以看一下主要加载了哪些模块
其中可以看到,加载了一系列的队列信息,这些队列主要服务于各个请求处理器内部的线程池服务的,
不同处理器的的线程资源隔离,其内部的服务队列也不同,依赖BrokerConfig的配置,可以修改
再关注一下BrokerController对象在创建完毕之后调用的initialize方法,这个方法进行了一系列初始化的工作
篇幅也是比较长的,总结一下这个方法主要做的事情:
1.加载broker服务器自身持久化存储的各个资源以及配置
2.初始化默认的存储模块DefaultMessageStore
3.依据DefaultMessageStore 加载broker服务的commitlog(消息存储文件)、indexFile(索引文件)、ConsumeQueue(消息队列文件)、abort服务是否正常启动文件)、storeCheckpoint(存储检查点文件)
4.初始化Netty服务,用于broker服务器接收请求
5.初始化请求处理器的线程池,注册请求处理器,并且把线程池关联到请求处理器上
6.开启一些列的定时调度任务
7.初始化事务消息服务、ACL权限相关、以及加载Hook函数
initialize方法篇幅较长,但是内容还是比较清晰比较有层次的
接来下就是调用start方法,正式启动broker服务,开始接受客户端的请求了
BrokerController的start方法,主要做的工作就是启动之前步骤中已经初始化好的各项服务,一同构建broker服务
至此,broker模块解析的第一篇Broker初始化以及启动已经介绍完毕了,这篇文章涉及到了broker服务的方方面面,涉及的内容较多,比较重要的模块只是加了注释解释了一下主要做什么工作而已,后续关于RocketMQ的文章中,会详细拆解其中涉及的各个子模块,一同进步学习。
网友评论