Broker CommitLog索引机制中的构建过程
1.创建ConsumeQueue和IndexFile。
ConsumeQueue和IndexFile两个索引都是由ReputMessageService类创建的
RequestMessageService类图
ReputMessageService服务启动后的执行过程。
doReput()方法用于创建索引的入口,通常通过以下几个步骤来创建索引:
- 第一步:从CommitLog中查找未创建索引的消息,将消息组装成DispatchRequest对象.该逻辑主要在
CommitLog.checkMesageAndReturnSize()方法中实现
- 第二步:调用doDispatch()方法,该方法会循环多个索引处理器(这里初始化了
CommitLogDispatcherBuildConsumeQueue和CommitLogDispatcherBuildIndex两个索引处理器)
并调用索引处理器的dispatch()方法来处理DispatchRequest
CommitLogDispatcherBuildConsumeQueue索引处理器用于构建ConsumeQueue,CommitLogDispatcherBuildIndex用于构建IndexFile
ConsumeQueue是必须创建的,IndexFile是否需要创建则是通过设置messageIndexEnable为True或False来实现的,默认为True.ConsumeQueue的索引信息被保存到PageCache后,其持久化的过程和CommitLog异步刷盘的过程类似,执行DefaultMessageStore.FlushConsumeQueueService服务
索引创建失败怎么办?
如果消息写入CommitLog后Broker宕机了,那么ConsumeQueue和IndexFile索引肯定就创建失败了,
此时ReputMessageService如何保证创建索引的可靠性呢?
ConsumeQueue和IndexFile每次刷盘时都会做Checkpoint操作,Broker每次重启的时候可以根据Checkpoint信息得知哪些消息还未创建索引,