broker的启动类在brokerStartUp 的main方法
一。 首先调用createBrokerController方法创建brokerController:
NettyClientConfig,NettyServerConfig,BrokerConfig,MessageStoreConfig 这4个配置文件对象的创建,里面都配置了默认值
broker会同时去加载我们预先配置好的配置文件,配置文件中配置的属性会覆盖对应的这4个配置对象中的配置。比如brokerName,brokerId等都需通过配置文件去配置覆盖。
之后将这4个配置文件对象当做参数 传入BrokerController的构造函数,这里真正创建了BrokerController,brokerController的构造方法中也初始化了非常多的broker所必备的组件。
例如ConsumerOffsetManager(消费集群消费进度组件),topicConfigManager,ConsumerFilterManager,ConsumerManager,ProducerManager,PullRequestHoldService,slaveSynchronize等等重要组件。
二. 当broker创建好之后,继而调用brokerController.initialize()方法进行后续的初始化。
1. 首先去将存储在服务器上面的 topic的配置信息,消费者的消费进度, 消费者的订阅信息等等加载进来, 这些配置信息可为空, 因为本身这部分信息就是broker在运行的过程中自动持久化到服务器里的,我们这里去读取只是恢复
broker在关闭之前的各配置的情况。如果都为空也无妨意味着是一个新鲜的broker。
2. 接着创建MessageStore组件, 这个messageStore就是broker存储消息的最核心组件对象了。构造方法中核心是创建了commitlog,ConsuemqeueTable(ConcurrentHashMap),还有flushConsumeQueueService的刷盘线程(Commitlog的刷盘线程在CommitLog组件里面),consumeQueue的转发线程reputMessageService线程, 延迟消息服务线程scheduleMessageService,haService线程等。
这边可以重点关注下CommitLog的构造方法。 首先会创建一个MappedFileQueue,这个是rocketmq抽象出来的一个文件存储对象。CommitLog,ConsumeQueue,Index等文件所存储的文件所在的文件夹在代码中对应的映射就是这么一个MappedFileQueue。
MappedFileQueue里面有个MappedFileList 用来存储MappedFile,一个MpaedFile对应一个文件。我们读取,写入都是通过MappedFile提供的api进行操作的.
之后创建CommitLog对应的刷盘线程,若是同步刷盘则对应的刷盘线程为GroupCommitServce,若为异步刷盘则为FlushRealTimeService。
再回到MessageStore的构造方法,还会创建清理commitLog和ConsumeQUEUE的清理线程,主从同步服务线程,reputMessageSerivce服务线程等等 都是非常重要的组件。
messageStore创建好之后就需要调用对应的load方法,这个load方法则是加载和恢复已经存在文件中的commitLog,ConsumeQueue等文件,这个方法非常之复杂后续可单开一个章节介绍。
当load成功之后就开始broker 网络层组件的创建,首先是实例化remotingServer组件, 同时还会创建非常多的processor线程池, 每个线程池都有自己的单一职责,比如处理发送信息,处理心跳
处理拉取信息等等请求,不同的请求类型对应会路由到对应的线程池进行异步处理然后通过netty返回给请求方。
进而创建remotingClient,因为对于broker而言,它是作为消费者和生产者的服务端,但是对于nameserver而言则是一个client,如果需要请求nameserver则需要创建对应的网络客户端组件,即
remotingClient。
再然后就是启动一些定时任务,例如持久化broker端的配置文件,每5秒执行一次,若为主节点定时在日志中打印从节点与其存储的消息差值等。
最后则去初始化rocketmq的事务组件等。 事务也可以单拎出来写一章。
三.当brokercontroller 初始化完成后就调其start方法。
1.messagestore里面的一些持久化任务,reput转发任务等启动起来,ha等等任务正式启动
2.网络层正式启动broker端的netty层代码 开始提供服务
3. 注册当前broker到nameserver,启动心跳上报定时上报到nameserver
就此 一个broker启动的大致流程即使如此,但是每个组件的初始化和start之后有太多太多的细节不能写出来。还需要大家细细的去源码中感受rocketmq的魅力。