消息中间件之RocketMQ源码分析(十七)

本文详细解析了RocketMQ中的BrokerCommitLog索引机制,特别是ConsumerQueue的结构,包括物理位点、消息体大小和Tag的Hash值。此外,还介绍了IndexFile的Hash索引设计,以及在处理Hash碰撞时的策略,如最新消息优先原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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槽位中保存的总是最新消息的指针,这是因为在消息队列中,
用户最关心的总是最新的数据在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_babe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值