1. 程式人生 > >【RocketMQ】7.RocketMQ 關鍵特性之訊息查詢

【RocketMQ】7.RocketMQ 關鍵特性之訊息查詢

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 。