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(索引文件)的主要内容,如果未能解决你的问题,请参考以下文章