分布式佇列因為有高可靠性的要求,所以資料要進行持久化儲存。
訊息生成者傳送訊息
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
訊息的儲存是由consumequeue
和commitlog
配合完成的,訊息真正的物理儲存檔案是commitlog
,consumequeue
是訊息的邏輯佇列,儲存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_flush
、async_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儲存的目錄。每乙...