一、读取启动配置文件
二、加载本地数据文件
1、加载topics.json
2、加载consumerOffset.json
3、加载subscriptionGroup.json
4、加载consumerFilter.json
5、判断abort文件是否存在:存在表示上一次broker是异常启动
6、加载delayOffset.json
7、加载commitLog文件
8、加载consumeQueue文件
9、加载checkpoint文件
10、加载index文件
1)如果上一次是异常退出,则比较index文件的endTimestamp(最后索引的时间)与checkpoint中的getIndexMsgTimestamp时间
2)如果endTimestamp大,则删除该index文件,否则正常加载index文件
三、根据上一次是否异常退回修复文件
1、检测修复
consumeQueue文件:遍历每个主题下面queueId对应的所有文件
1)读取最后3个consumeQueue文件,如果不到3个文件,就从头开始读取
2)获取文件中每个数据,进行判断是否正常,直到所有数据都读取完或发现错误
3)设置mappedFileQueue中的flushWhere与committedWhere值为最后正常的processOffset
4)删除processOffset之后的数据
2、检测修复
commitLog文件
2.1、如果上一次正常退出
1)读取最后3个
commitLog文件,如果不到3个文件,就从头开始读取
2)获取文件中每个数据,进行判断是否正常,直到所有数据都读取完或发现错误
3)设置mappedFileQueue中的flushWhere与committedWhere值为最后正常的processOffset
4)删除processOffset之后的数据
2.2、如果上一次异常退出
1)从最后一个commitLog文件开始遍历,进行数据比对,选择合适的一个commitLog文件开始恢复
2)获取文件中的第一条消息存储的时间,跟checkpoint中的MinTimestamp或getMinTimestampIndex做对比,如果storeTimestamp小于该时间,则从这个文件开始恢复
3)开始从这个文件读取数据,并对比body的CRC码进行判断是否正常,如果是正常的,做一次分发,将数据同步到consumeQueue与index中(这里可能会导致部分数据重复)
4)设置mappedFileQueue中的flushWhere与committedWhere值为最后正常的processOffset
5)删除processOffset之后的数据
3、设置commitLog中的
setTopicQueueTable
四、设置各种线程池,并与对应的业务做注册
例子:
this.remotingServer.registerProcessor(RequestCode.SEND_MESSAGE,sendProcessor, this.sendMessageExecutor);
五、设置定时循环任务
1、定时统计broker数据
2、定时持久化消费者的Offset
3、定时持久化消费者过滤信息
4、定时检测是否开启broker保持
5、定时打印流量情况
6、定时打印分发数据情况
7、如果nameSrv是从远程获取的,则定时从远处获取
8、如果是slave节点,则定时从master同步集群信息,如果是master节点,则定时打印master与slave的不同
六、主线程启动
1、检测是否获取锁,没有获取就抛出异常
2、启动consemeQueue的刷盘线程
3、启动commitLog相关的刷盘线程
1)启动commitLog刷盘线程
2)如果启动了TransientStorePoolEnable参数,则启动commit线程
4、启动存储统计线程
5、启动延迟队列线程
6、设置reputMessageService开始的ReputFromOffset值并启动
7、同步线程启动
8、创建临时文件
9、启动定时清理文件线程
10、启动定时自我检测线程
11、启动服务端口
12、启动fastRemotingServer
13、启动fileWatchService
14、brokerOuterAPI
15、pullRequestHoldService
16、clientHousekeepingService
17、filterServerManager
18、向namesrc注册,并开启任务进行注册