RocketMQ 訊息儲存結構

2021-09-25 06:39:20 字數 2553 閱讀 3416

引用:

rmq採用順序寫,隨機讀的設計理念:

commitlog順序寫,可以大大提高寫人效率。

雖然是隨機讀,但是利用作業系統的pagecache機制,可以批量地從磁

盤讀取,作為cache存到記憶體中,加速後續的讀取速度。

rocketmq訊息的儲存是由consumequeuecommitlog配合完成的:

如果乙個topic要傳送和接收的資料量非常大,需要能支援增加並行處理的機器來提高處理速度,這時候乙個topic可以根據需求設定乙個或多個messagequeue,topic有了多個messagequeue後,訊息可以並行地向各個

messagequeue傳送,消費者也可以並行地從多個messagequeue讀取訊息並消費。

寫訊息

dispatch

commit log持久後,會將裡面的資料dispatch到對應的consume queue上。

消費邏輯底層

消費時,consumer不直接與commit log打交道,而是從consume queue中去拉取資料.每乙個consume queue都是順序讀

光拉取consume queue是沒有資料的,裡面只有乙個對commit log的引用,所以再次拉取commit log。

為了簡述方便,來個例子:假如集群有乙個broker,topic為binlog的佇列(consume queue)數量為4,如下圖所示,按順序傳送這5條內容各不相同訊息。

message msg1 =

newmessage

("binlog"

,"order"

,"1001"

,"content 111"

.getbytes

(remotinghelper.default_charset));

message msg2 =

newmessage

("binlog"

,"inst"

,"1002"

,"content 222"

.getbytes

(remotinghelper.default_charset));

message msg3 =

newmessage

("binlog"

,"menu"

,"1003"

,"content 333"

.getbytes

(remotinghelper.default_charset));

message msg4 =

newmessage

("binlog"

,"menu"

,"1004"

,"content 444"

.getbytes

(remotinghelper.default_charset));

message msg5 =

newmessage

("binlog"

,"order"

,"1005"

,"content 555"

.getbytes

(remotinghelper.default_charset)

);

寫訊息首先,rmq的訊息整體是有序的,所以這5條訊息按順序將內容持久化在commit log中。

RocketMQ訊息儲存

分布式佇列因為有高可靠性的要求,所以資料要進行持久化儲存。訊息生成者傳送訊息 mq收到訊息,將訊息進行持久化,在儲存中新增一條記錄 返回ack給生產者 mq push訊息給對應的消費者,然後等待消費者返回ack 如果訊息消費者在指定時間內成功返回ack,那麼mq認為訊息消費成功,在儲存中刪除訊息,即...

RocketMQ 訊息儲存

訊息儲存 主要的儲存檔案 1 訊息檔案 commitlog 2 訊息消費佇列檔案 consumequeue 3 hash索引檔案 indexfile 4 檢測點檔案 checkpoint 5 關閉異常檔案 abort 檔案刷盤機制 同步刷寫 訊息追加到記憶體後,立即將記憶體訊息刷寫到磁碟,再對客戶端...

訊息佇列(三)RocketMQ如何儲存訊息

rocket的訊息是有consume queue和commit log組成。consume queue consume queue是訊息的邏輯佇列,相當於字典目錄,用來指定訊息在物理檔案 commit log 上的位置,我們可以在配置中指定consumequeue和commitlog儲存的目錄。每乙...