RocketMQ消息查询

区别于消息消费:先尝后买

尝就是消息查询

买:消息的消费

RocketMQ支持按照下面两种维度("按照Message ld查询消息"、"按照Message Key查询消息")进行消息查询。

1按照Messageld查询消息

RocketMQ消息查询_第1张图片

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

在RocketMQ中具体做法是:Client端从Messageld中解析出Broker的地址(IP地址和端口)和Commit Log的偏移地址后封装成一个RPC请求后,通过Remoting通信层发送(业务请求码:VIEW_MESSAGE_BY_ID)。Broker使用QueryMessageProcessor,使用请求中的commitLog offset和size去commitLog中找到真正的记录并解析成一个完整的消息返回。

2按照Message Key查询消息

"按照Message Key查询消息",主要是基于RocketMQ的IndexFile索引文件来实现的。RocketMQ的索引文件逻辑结构,类似DK中HashMap的实现。

(1)根据查询的key的hashcode%slotNum得到具体的槽的位置(slotNum是一个索引文件里面包含的最大槽的数目)。

(2)根据slotValue (slot位置对应的值)查找到索引|项列表的最后一项(倒序排列,slotValue总是指向最新的一个索引项)。

(3)遍历索引项列表返回查询时间范围内的结果集(默认一次最大返回的 32条记录)

(4)Hash冲突

第一种,key的hash值不同但模数相同,此时查询的时候会再比较一次key的hash值(每个索引项保存了key的hash值),过滤掉hash值不相等的项。

第二种,hash值相等但key不等,出于性能的考虑冲突的检测放到客户端处理(key的原始值是存储在消息文件中的,避免对数据文件的解析),客户端比较一次消息体的key是否相同。

(5)存储:为了节省空间索引项中存储的时间是时间差值(存储时间-开始时间,开始时间存储在索引文件头中),整个索引文件是定长的,结构也是固定的。

你可能感兴趣的:(中间件,rocketmq)