RocketMQ IndexFile(索引文件)

Posted 乐观男孩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RocketMQ IndexFile(索引文件)相关的知识,希望对你有一定的参考价值。

目录

说明

RocketMQ支持根据消息的key进行消息查询,由于消息都是顺序存在MapperFile上,当需要根据指定的key进行消息查找时,只能对所有的消息进行遍历,显然这种方法是不可取的。为了提高消息查询效率,RocketMQ会为每条消息里的key建立索引,加快消息的检索。
ReputMessageService,会不停地检测是否有新的消息还未建立索引,当发现某条消息还未建立索引时,会将建立索引的任务分发给CommitLogDispatcherBuildIndex,然后再通过IndexService为这条消息建立索引。所以流程图大概如下:

索引建立过程

1、ReputMessageService不断的从CommitLog中获取未建立索引的消息

2、获取到未建立索引的消息后,会进行分发
分发的对象是从dispatcherList获取的,dispatcherList在DefaultMessageStore实例化时已经进行了初始化。这里只需要关注CommitLogDispatcherBuildIndex。

3、CommitLogDispatcherBuildIndex直接转发给IndexService进行处理

4、IndexService的处理

(1)、先获取IndexFile
(2)、然后进行索引构建工作

具体构建工作在IndexFile内实现

5、IndexFile的处理

IndexFile文件结构

1、IndexHeader总长占40字节长,包含6部分内容:当前IndexFile文件第一条消息的保存时间、最新消息的保存时间、第一条消息的offset、最新消息的offset、hash槽数量、索引数量。
2、接下来是hash槽的内容:一个文件最多有500W个hash槽,每个hash槽占4字节,hash槽存储的内容为索引的具体位置。
3、接下来会空余20字节,这是由于indexCount默认为1引起的。

4、接下来是索引的具体数据:一个文件最多有2000W个索引数据,每个索引数据占20字节,包含4部分内容:key的hash值、消息的offset、与当前文件第一条消息的时间差、当发生hash冲突时,上一条消息的索引数据位置(这样当发生索引冲突时,就能够往上找。假设有两条消息的hash值刚好落在hashSlot-1,前一条消息的索引数据保存在Index-100,后一条数据的索引数据保存在Index-1,则Index-1索引数据的slotValue保存的就是索引Index-100的起始位置)。

总结

1、RocketMQ的索引文件底层使用的是hash索引。
2、一个索引文件分三个部分:头部、hash槽(500W)、索引数据(2000W)。
3、索引文件保存在 s t o r e P a t h / storePath/ storePath/fileName,文件名为创建索引文件时的系统时间戳

以上是关于RocketMQ IndexFile(索引文件)的主要内容,如果未能解决你的问题,请参考以下文章

RocketMQ IndexFile(索引文件)

rocketmq的broker接收消息的时候,如何更新consumeQueue和indexfile的

consumeQueue 和 indexFile 文件

RocketMQ之底层IndexFile存储协议

RocketMQ 消息存储

RocketMQIndexFile