【RocketMQ】7.RocketMQ 關鍵特性之訊息查詢
阿新 • • 發佈:2019-01-25
7.3.1 按照 Message Id 查詢訊息
MsgId 總共 16 位元組,包含訊息儲存主機地址,訊息 Commit Log offset。從 MsgId 中解析出 Broker 的地址和Commit Log 的偏移地址,然後按照儲存格式所在位置訊息 buffer 解析成一個完整的訊息。
7.3.2 按照 Message Key 查詢訊息
- 根據查詢的key的hashcode%slotNum得到具體的槽的位置 (slotNum是一個索引檔案裡面包含的最大槽的數目,例如圖中所示 slotNum=5000000) 。
- 根據 slotValue(slot 位置對應的值)查詢到索引項列表的最後一項(倒序排列,slotValue 總是指向最新的一個索引項) 。
- 遍歷索引項列表返回查詢時間範圍內的結果集(預設一次最大返回的 32 條記錄)
- Hash 衝突;尋找 key 的 slot 位置時相當於執行了兩次雜湊函式,一次 key 的 hash,一次 key 的 hash 值取模,因此這裡存在兩次衝突的情況;第一種,key 的 hash 值不同但模數相同,此時查詢的時候會在比較一次 key 的hash 值(每個索引項儲存了 key 的 hash 值) ,過濾掉 hash 值不相等的項。第二種,hash 值相等但 key 不等,出於效能的考慮衝突的檢測放到客戶端處理(key 的原始值是儲存在訊息檔案中的,避免對資料檔案的解析) ,客戶端比較一次訊息體的 key 是否相同。
- 儲存;為了節省空間索引項中儲存的時間是時間差值(儲存時間-開始時間,開始時間儲存在索引檔案頭中) ,整個索引檔案是定長的,結構也是固定的。索引檔案儲存結構參見圖 7.4.3-3 。