RocketMQ IndexFile(索引文件)

目录

  • 说明
  • 索引建立过程
  • IndexFile文件结构
  • 总结

说明

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

索引建立过程

1、ReputMessageService不断的从CommitLog中获取未建立索引的消息
RocketMQ IndexFile(索引文件)_第2张图片
2、获取到未建立索引的消息后,会进行分发
RocketMQ IndexFile(索引文件)_第3张图片分发的对象是从dispatcherList获取的,dispatcherList在DefaultMessageStore实例化时已经进行了初始化。这里只需要关注CommitLogDispatcherBuildIndex。
RocketMQ IndexFile(索引文件)_第4张图片
3、CommitLogDispatcherBuildIndex直接转发给IndexService进行处理
RocketMQ IndexFile(索引文件)_第5张图片
4、IndexService的处理
RocketMQ IndexFile(索引文件)_第6张图片
(1)、先获取IndexFile
RocketMQ IndexFile(索引文件)_第7张图片(2)、然后进行索引构建工作
RocketMQ IndexFile(索引文件)_第8张图片
具体构建工作在IndexFile内实现
RocketMQ IndexFile(索引文件)_第9张图片
5、IndexFile的处理
RocketMQ IndexFile(索引文件)_第10张图片
RocketMQ IndexFile(索引文件)_第11张图片

IndexFile文件结构

RocketMQ IndexFile(索引文件)_第12张图片1、IndexHeader总长占40字节长,包含6部分内容:当前IndexFile文件第一条消息的保存时间、最新消息的保存时间、第一条消息的offset、最新消息的offset、hash槽数量、索引数量。
2、接下来是hash槽的内容:一个文件最多有500W个hash槽,每个hash槽占4字节,hash槽存储的内容为索引的具体位置。
3、接下来会空余20字节,这是由于indexCount默认为1引起的。
RocketMQ IndexFile(索引文件)_第13张图片
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},文件名为创建索引文件时的系统时间戳。

你可能感兴趣的:(MQ#RocketMQ,RocketMQ,分布式,中间件,java,后端)