引用:rmq採用
順序寫,隨機讀
的設計理念:
commitlog順序寫,可以大大提高寫人效率。
雖然是隨機讀,但是利用作業系統的pagecache機制,可以批量地從磁
盤讀取,作為cache存到記憶體中,加速後續的讀取速度。
rocketmq訊息的儲存是由consumequeue
和commitlog
配合完成的:
如果乙個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條內容各不相同訊息。
寫訊息首先,rmq的訊息整體是有序的,所以這5條訊息按順序將內容持久化在commit log中。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)
);
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儲存的目錄。每乙...