rocketmq是我們常用的訊息中介軟體之一,現在我們就來分析一下,它是如何儲存和讀取訊息的。
rocketmq是把訊息持久化在本地的檔案系統的,所有的訊息,都儲存在commitlog檔案中,這個檔案是不區分topic或者messagequeue的,所有的訊息,都是儲存在一起,這個點跟常見的kafka不同,kafka不同的分割槽,是儲存在不同的檔案中的,但是也因此引發了別的問題,就是在分割槽特別多的時候,由於檔案數量太多,導致資料的讀取效率急速下降,一般在幾十個分割槽左右,不建議使用過多的分割槽,但是rocketmq最多可以支援上萬的topic,就是因為兩者的檔案儲存不同。因為rocketmq檔案儲存使用的是同乙個檔案,所以訊息的寫入是順序的,每來乙個訊息,寫入檔案尾就可以了,效率很快。
但是光使用乙個commitlog檔案,肯定是不行的,因為不同的消費者,消費的messagequeue不同(這個具體可以看rocketmq的消費模型),不能每次拉取訊息時,服務端都要遍歷commitlog,然後找到對應的訊息返回,這樣效率太低了,這個時候,rocketmq使用的就是consumequeue檔案,該檔案可以理解為是邏輯上的佇列,乙個consumequeue檔案,對應乙個服務端上的messagequeue,但是裡面儲存的不是真正的訊息體,而是該messagequeue裡面訊息儲存在commitlog檔案中的的位置,所以檔案尺寸是很小的,實際情況下,大部分的consumequeue都是能全部存入記憶體中的,也就是可以很快的知道該messagequeue中的下一條訊息在commitlog的位置,再通過randomaccessfile來實現隨機讀,同樣可以達到很快的訊息讀取效率。
rocketmq的儲存結構如圖所示,producer傳送訊息到服務端之後,直接儲存在commit log檔案中,同時根據訊息的messagequeue資訊,在對應的comsumequeue檔案的尾部,新增這條訊息的記錄,也就是在commitlog檔案中的位置,不同的消費者,根據消費的messagequeue,通過對應的consumequeue獲取訊息位置,並獲取訊息。
總體來說,rocketmq是通過實現順序讀,隨機寫,來保證自己的效率的。
RocketMQ訊息型別
普通資訊也叫做無序訊息,簡單來說就是沒有順序的訊息,producer 只管傳送訊息,consumer 只管接收訊息,至於訊息和訊息之間的順序並沒 可能先傳送的訊息先消費,也可能先傳送的訊息後消費。舉個簡單例子,producer 依次傳送 order id 為 1 2 3 的訊息到 broker,co...
RocketMQ 事務訊息
一 事務訊息實現方式 應用使用事務訊息的步驟 1 應用傳送訊息,使用prepare欄位標示準備訊息 2 應用執行本地業務邏輯 3 應用傳送事務提交或回滾訊息 broker收到prepare訊息後會將topic替換為rmq sys trans half topic,queueid替換為0,然後寫入co...
rocketMq訊息查詢
最近有人問我知道rocketmq是怎麼查詢訊息的,我發現我貌似回答不上來,所以抽空就把這塊內容補充一下,主要是講清楚根據key查詢訊息和根據msgid查詢訊息兩塊內容。看下引數列表中我們可以看到 k指出了核心key的引數,指定了根據key查詢訊息的方法,這個命令返回的是msgid,據說還有一些坑,可...