【RocketMQ】7.RocketMQ 关键特性之消息查询

本文介绍了RocketMQ中两种消息查询方式:通过MessageId查询及MessageKey查询的具体实现过程。包括如何解析MessageId获取消息存储信息,以及MessageKey查询时如何进行哈希计算定位到消息的存储位置,并解决哈希冲突问题。

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

7.3.1 按照 Message Id 查询消息

这里写图片描述

MsgId 总共 16 字节,包含消息存储主机地址,消息 Commit Log offset。从 MsgId 中解析出 Broker 的地址和Commit Log 的偏移地址,然后按照存储格式所在位置消息 buffer 解析成一个完整的消息。

7.3.2 按照 Message Key 查询消息

这里写图片描述

  1. 根据查询的key的hashcode%slotNum得到具体的槽的位置 (slotNum是一个索引文件里面包含的最大槽的数目,例如图中所示 slotNum=5000000) 。
  2. 根据 slotValue(slot 位置对应的值)查找到索引项列表的最后一项(倒序排列,slotValue 总是指向最新的一个索引项) 。
  3. 遍历索引项列表返回查询时间范围内的结果集(默认一次最大返回的 32 条记录)
  4. Hash 冲突;寻找 key 的 slot 位置时相当于执行了两次散列函数,一次 key 的 hash,一次 key 的 hash 值取模,因此这里存在两次冲突的情况;第一种,key 的 hash 值不同但模数相同,此时查询的时候会在比较一次 key 的hash 值(每个索引项保存了 key 的 hash 值) ,过滤掉 hash 值不相等的项。第二种,hash 值相等但 key 不等,出于性能的考虑冲突的检测放到客户端处理(key 的原始值是存储在消息文件中的,避免对数据文件的解析) ,客户端比较一次消息体的 key 是否相同。
  5. 存储;为了节省空间索引项中存储的时间是时间差值(存储时间-开始时间,开始时间存储在索引文件头中) ,整个索引文件是定长的,结构也是固定的。索引文件存储结构参见图 7.4.3-3 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

帅胖子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值