天天看點

rocketMq消息查詢

概述

    最近有人問我知道rocketMq是怎麼查詢消息的,我發現我貌似回答不上來,是以抽空就把這塊内容補充一下,主要是講清楚

根據key查詢消息

根據msgId查詢消息

兩塊内容。

    看下參數清單中我們可以看到-k指出了核心key的參數,指定了根據key查詢消息的方法,這個指令傳回的是msgId,據說還有一些坑,可以參考

網易團隊

的這篇博文。

rocketMq消息查詢

根據key查詢

    查詢過程中我們從client端看可以看出來,其實根據key去查詢的過程中其實是周遊所有broker去進行查詢的,然後針對查詢結果進行組合。

    由于這個查詢過程中server端涉及到index對象,關于index部分的查詢參見《

rocketMq - index介紹

》博文。

rocketMq消息查詢

根據key查詢-client-1

rocketMq消息查詢

根據key查詢-client-2

rocketMq消息查詢

根據key查詢-client-3

rocketMq消息查詢

根據key查詢-client-4

rocketMq消息查詢

根據key查詢-server-1

rocketMq消息查詢

根據key查詢-server-2

    根據msgId的查詢的參數如下圖所示,可以看出來核心的參數在于-i的參數,也就是msgId。根據msgId去查詢消息的過程中最重要的當然是msgId的參數了。

rocketMq消息查詢

根據msgId查詢

    根據msgId查詢的核心點在于msgId的生成規律,其實msgId是有兩個部分組成的,分别是broker的address 和 commitLog的實體偏移量offset,也就是說通過messageId我們就能知道去哪個broker的哪個位置offset去擷取消息體。

    關于messageId的消息體,可以見下圖中decodeMessageId的類圖。

    client端的查詢過程和server端的解析查詢過程都在下面的代碼中貼出來,相信大家應該都能夠看得懂的。

rocketMq消息查詢

根據msgId查詢-client-1

rocketMq消息查詢

根據msgId查詢-client-2

rocketMq消息查詢

根據msgId查詢-client-3

rocketMq消息查詢

根據msgId查詢-server-1

rocketMq消息查詢

根據msgId查詢-server-2

rocketMq消息查詢

根據msgId查詢-server-3