1、创建消息存储对象MessageStore,执行load方法
调用isTempFileExist方法判断上次broker是否是正常退出,如果是正常退出不会保留abort文件,异常退出则会。
加载CommitLog日志文件。CommitLog文件是真正存储消息内容的地方。
commotlog目录下面是一个个的commitlog文件,但是在Java中进行了三层映射,CommitLog-MappedFileQueue-MappedFile,CommitLog中包含MappedFileQueue,以及commitlog相关的其他服务,例如刷盘服务;MappedFileQueue中包含MappedFile集合,以及单个commotlog文件大小等属性,而MappedFile才是真正的一个commotlog文件在Java中的映射,包含文件名、大小、mmap对象mappedByteBuffer等属性。
实际上MappedFileQueue和MappedFile都是通用类,commitlog、comsumequeue、indexfile文件都会使用到。
加载文件都采用mmap内存映射
这种mmap+write的方式相比于传统IO少了一次CPU Copy,从而极大地提高了效率。虽然性能弱于sendfile零拷贝,但其好处是可以在中途修改内存中的数据之后再传输。
加载ConsumeQueue文件。ConsumeQueue文件可以看作是CommitLog的消息偏移量索引文件。
加载 index 索引文件。Index文件可以看作是CommitLog的消息时间范围索引文件。
恢复ConsumeQueue文件和CommitLog文件,将正确的的数据恢复至内存中,删除错误数据和文件。
加载RocketMQ延迟消息的服务,包括延时等级、配置文件等等。
2、创建StoreCheckpoint检查点对象
StoreCheckpoint记录着commitLog、consumeQueue、index文件的最后更新时间点,当上一次broker是异常结束时,会根据StoreCheckpoint的数据进行恢复,这决定着文件从哪里开始恢复,甚至是删除文件。
3、恢复CommitLog和ConsumeQueue数据
该方法用于恢复CommitLog和ConsumeQueue数据到内存中
首先恢复所有的ConsumeQueue文件,返回在ConsumeQueue有效区域存储的最大的commitlog偏移量。
随后对于commitlog文件进行恢复,根据上次broker是否正常退出,有正常恢复和异常恢复的选择。
最后再对topicQueueTable进行恢复。