概述
最近有人問我知道rocketMq是怎麼查詢消息的,我發現我貌似回答不上來,是以抽空就把這塊内容補充一下,主要是講清楚
根據key查詢消息和
根據msgId查詢消息兩塊内容。
看下參數清單中我們可以看到-k指出了核心key的參數,指定了根據key查詢消息的方法,這個指令傳回的是msgId,據說還有一些坑,可以參考
網易團隊的這篇博文。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYTNkNjM2AjNhFDOwETYlZDZ1gzN1MmM3Y2M4YWN5UGZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
根據key查詢
查詢過程中我們從client端看可以看出來,其實根據key去查詢的過程中其實是周遊所有broker去進行查詢的,然後針對查詢結果進行組合。
由于這個查詢過程中server端涉及到index對象,關于index部分的查詢參見《
rocketMq - index介紹》博文。
根據key查詢-client-1
根據key查詢-client-2
根據key查詢-client-3
根據key查詢-client-4
根據key查詢-server-1
根據key查詢-server-2
根據msgId的查詢的參數如下圖所示,可以看出來核心的參數在于-i的參數,也就是msgId。根據msgId去查詢消息的過程中最重要的當然是msgId的參數了。
根據msgId查詢
根據msgId查詢的核心點在于msgId的生成規律,其實msgId是有兩個部分組成的,分别是broker的address 和 commitLog的實體偏移量offset,也就是說通過messageId我們就能知道去哪個broker的哪個位置offset去擷取消息體。
關于messageId的消息體,可以見下圖中decodeMessageId的類圖。
client端的查詢過程和server端的解析查詢過程都在下面的代碼中貼出來,相信大家應該都能夠看得懂的。
根據msgId查詢-client-1
根據msgId查詢-client-2
根據msgId查詢-client-3
根據msgId查詢-server-1
根據msgId查詢-server-2
根據msgId查詢-server-3