天天看點

ActiveMQ--持久化機制

ActiveMQ持久化機制

為了避免意外當機以後丢失資訊,需要做到重新開機後可以恢複消息隊列,消息系統一般都會采用持久化機制。

ActiveMQ的持久化機制有JDBC,AMQ,KahaDB和LevelDB,無論使用哪種持久化方式,消息的存儲邏輯都是一緻的。就是在發送者将消息發送出去後,消息中心首先将消息存儲到本地資料檔案、記憶體資料庫或者遠端資料庫等再試圖将消息發送給接收者,成功則将消息從存儲中删除,失敗則繼續嘗試發送。

消息中心啟動以後首先檢查指定的存儲位置,如果有未發送成功的消息,則需要把消息發送出去。

AMQ Message Store

AMQ是一種檔案存儲形式,它具有寫入速度快和容易恢複的特點。消息存儲再一個個檔案中,檔案的預設大小為32M,當一個存儲檔案中的消息已經全部被消費,那麼這個檔案将被辨別為可删除,在下一個清除階段,這個檔案被删除。

AMQ适用于ActiveMQ5.3之前的版本。

KahaDB(預設)

基于日志檔案,從ActiveMQ5.4開始預設的持久化插件。

官網配置表:http://activemq.apache.org/kahadb

ActiveMQ--持久化機制

預設存儲位置:

ActiveMQ--持久化機制

KahaDb是目前預設的存儲方式,可用于任何場景,提高了性能和恢複能力。

消息存儲使用一個事務日志和僅僅用一個索引檔案來存儲它所有的位址。

KahaDB是一個專門針對消息持久化的解決方案,它對典型的消息使用模式進行了優化。資料被追加到data logs中。當不再需要log檔案中的資料的時候,log檔案會被丢棄。

ActiveMQ--持久化機制

kehaDB在消息儲存目錄中隻有4類檔案和一個lock,跟ActiveMQ的其他幾種檔案存儲引擎相比非常簡潔。

1.  db-<Number>.log 
KahaDB存儲消息到預定義大小的資料記錄檔案中,檔案命名為db-<Number>.log。當資料檔案已滿時,一個新的檔案會随之建立,number數值也會随之遞增,它随着消息數量的增多,如每32M一個檔案,檔案名按照數字進行編号,如db-1.log、db-2.log....。當不再有引用到資料檔案中的任何消息時,檔案會被删除。
           
ActiveMQ--持久化機制
2. db.data
該檔案包含了持久化的BTree索引,索引了消息資料記錄中的消息,它是消息的索引檔案,本質上是B-Tree(B樹),使用BTree所謂索引指向db-<Number>.log裡面存儲的消息。
           
3. db.free
目前db.data檔案裡哪些頁面是空閑的,檔案具體内容是所有控線頁的ID
           
4. db.redo
用來進行消息恢複,如果KahaDB消息存儲再強制退出後啟動,用于恢複BTree索引。
           
5. lock
檔案鎖,表示目前獲得kahadb讀寫權限的broker。
           

JDBC

消息基于JDBC存儲。

LevelDB

這種檔案系統從ActiveMQ5.8之後引進,它和KahaDB非常相似,也是基于檔案的本地存儲資料庫形式,但是它提供比KahaDB更快的持久性。

但它不使用自定義B-Tree實作來索引預寫日志,而是使用基于LevelDB的索引。

預設配置如下:

<persistenceAdapter>
	<levelDBdirector="activemq-data"/>
</persistenceAdapter>
           

JDBC Message store with ActiveMQ Journal