Broker CommitLog索引机制的数据结构
ConsumerQueue消费队列
主要用于消费拉取消息、更新消费位点等所用的索引。源代码参考org.apache.rocketmq.store.ConsumerQueue.该文件内保存了消息的物理位点、消息体大小、消息Tag的Hash值
- 物理位点:消息在CommitLog中的位点值
- 消息体大小:包含消息Topic值大小、CRC值大小、消息体大小等全部数据的总大小,单位是字节
- Tag的Hash值:由MessageExtBrokerInner.tagsString2tagsCode()方法计算得来。如果消息有
Tag值,那么该值可以通过String的Hashcode获得
Index File
IndexFile是一个RocketMQ实现的Hash索引,主要在用户用消息key查询时使用,该索引是通过IndexFile类实现的。在RocketMQ中同时存在多个IndexFile文件,这些文件按照消息产生的时间顺序排列。每个Index File文件包含文件头、Hash槽位、索引数据。每个文件的Hash槽位个数、索引数据个数都是固定的。Hash槽位可以通过Broker启动参数maxHashSlotNum进行配置,默认值为500万;索引数据可以通过Broker启动参数maxIndexNum进行配置,默认值为500万,一个Index File约为400MB.
IndexFile的索引设计在一定程度上参考了Java中的HashMap设计,只是当IndexFile遇到Hash碰撞时只会用链表。而Java8中在一定情况下链表会转化为红黑树。
在Hash碰撞时,Hash槽位中保存的总是最新消息的指针,这是因为在消息队列中,
用户最关心的总是最新的数据