RocketMQ訊息儲存

2021-10-08 15:17:33 字數 3364 閱讀 5456

分布式佇列因為有高可靠性的要求,所以資料要進行持久化儲存。

訊息生成者傳送訊息

mq收到訊息,將訊息進行持久化,在儲存中新增一條記錄

返回ack給生產者

mq push訊息給對應的消費者,然後等待消費者返回ack

如果訊息消費者在指定時間內成功返回ack,那麼mq認為訊息消費成功,在儲存中刪除訊息,即執行第6步;如果mq在指定時間內沒有收到ack,則認為訊息消費失敗,會嘗試重新push訊息,重複執行4、5、6步驟

mq刪除訊息

apache下開源的另外一款mq—activemq(預設採用的kahadb做訊息儲存)可選用jdbc的方式來做訊息持久化,通過簡單的xml配置資訊即可實現jdbc訊息儲存。由於,普通關係型資料庫(如mysql)在單錶資料量達到千萬級別的情況下,其io讀寫效能往往會出現瓶頸。在可靠性方面,該種方案非常依賴db,如果一旦db出現故障,則mq的訊息就無法落盤儲存會導致線上故障。

memcached,許多web應用都將資料儲存到rdbms中,應用伺服器從中讀取資料並在瀏覽器中顯示。 但隨著資料量的增大、訪問的集中,就會出現rdbms的負擔加重、資料庫響應惡化、 **顯示延遲等重大影響。memcached是高效能的分布式記憶體快取伺服器。 一般的使用目的是,通過快取資料庫查詢結果,減少資料庫訪問次數,以提高動態web應用的速度、 提高可擴充套件性。

對比:

檔案系統》分布式kv儲存》關係型資料庫db

關係型資料庫db>分布式kv儲存》檔案系統

磁碟如果使用得當,磁碟的速度完全可以匹配上網路 的資料傳輸速度。目前的高效能磁碟,順序寫速度可以達到600mb/s, 超過了一般網絡卡的傳輸速度。但是磁碟隨機寫的速度只有大概100kb/s,和順序寫的效能相差6000倍!因為有如此巨大的速度差別,好的訊息佇列系統會比普通的訊息佇列系統速度快多個數量級。rocketmq的訊息用順序寫,保證了訊息儲存的速度。

linux作業系統分為【使用者態】和【核心態】,檔案操作、網路操作需要涉及這兩種形態的切換,免不了進行資料複製。

一台伺服器把本機磁碟檔案的內容傳送到客戶端,一般分為兩個步驟:

1)read:讀取本地檔案內容;

2)write:將讀取的內容通過網路傳送出去。

這兩個看似簡單的操作,實際進行了4次資料複製,分別是:

從磁碟複製資料到核心態記憶體;

從核心態記憶體複製到使用者態記憶體;

然後從使用者態記憶體複製到網路驅動的核心態記憶體;

最後是從網路驅動的核心態記憶體複製到網絡卡中進行傳輸。

rocketmq充分利用了上述特性,也就是所謂的「零拷貝」技術,提高訊息存檔和網路傳送的速度。

rocketmq訊息的儲存是由consumequeuecommitlog配合完成的,訊息真正的物理儲存檔案是commitlogconsumequeue是訊息的邏輯佇列,儲存topic相關資訊,類似資料庫的索引檔案,儲存的是指向物理儲存的位址。每個topic下的每個message queue都有乙個對應的consumequeue檔案。

訊息儲存的主要流程:

生產者傳送訊息後,訊息儲存:

(1)將訊息內容存入commitlog檔案

(2)將topic資訊存入consumerqueue檔案,裡面存入包括topic、起始偏移量、訊息長度等內容

(3)將一些索引資訊存入index檔案

消費者消費資訊時,根據topic查詢consumerqueue檔案,找到對應的topic,開始讀取訊息,此時讀取到的資料是訊息的起始偏移量和訊息長度,根據訊息的起始偏移量從commitlog中查詢對應的偏移量位置,然後根據訊息長度取commitlog中的資料,即取到了指定的訊息內容。

如果消費者獲取訊息使用了tag標籤,會使用index檔案,獲取訊息內容方式與上面類似。

rocketmq的訊息是儲存到磁碟上的,這樣既能保證斷電後恢復, 又可以讓儲存的訊息量超出記憶體的限制。rocketmq為了提高效能,會盡可能地保證磁碟的順序寫。訊息在通過producer寫入rocketmq的時候,有兩種寫磁碟方式,分布式同步刷盤和非同步刷盤。

1)同步刷盤

同步刷盤:記憶體對映檔案直接寫入磁碟。

在返回寫成功狀態時,訊息已經被寫入磁碟。具體流程是,訊息寫入記憶體的pagecache後,立刻通知刷盤執行緒刷盤, 然後等待刷盤完成,刷盤執行緒執完成後喚醒等待的執行緒,返回訊息寫成功的狀態。

2)非同步刷盤

非同步刷盤:記憶體對映檔案寫入堆外記憶體後非同步刷盤

在返回寫成功狀態時,訊息可能只是被寫入了記憶體的pagecache,寫操作的返回快,吞吐量大;當記憶體裡的訊息量積累到一定程度時,統一觸發寫磁碟動作,快速寫入。

3)配置

同步刷盤還是非同步刷盤,都是通過broker配置檔案裡的flushdisktype引數設定的,這個引數被配置成sync_flushasync_flush中的乙個。

RocketMQ 訊息儲存

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

RocketMQ 訊息儲存結構

引用 rmq採用順序寫,隨機讀的設計理念 commitlog順序寫,可以大大提高寫人效率。雖然是隨機讀,但是利用作業系統的pagecache機制,可以批量地從磁 盤讀取,作為cache存到記憶體中,加速後續的讀取速度。rocketmq訊息的儲存是由consumequeue和commitlog配合完成...

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

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