AMQ 訊息儲存
基本概念
這是 AcitveMQ 5 及以上版本的預設儲存方式。AMQ 訊息儲存是一個可嵌入的交易訊息儲存解決方案,它非常快速且可靠。
訊息命令會寫入到一個交易日誌中 - 該日誌由滾動資料日誌組成 - 這表示寫入速度非常快,且儲存的狀態很容易恢復。
訊息本身會持久儲存在日誌的資料日誌中 - 並由參考儲存 (預設為 Kaha) 持有其位置的參考,以便快速檢索。
訊息的參考會保存在記憶體中,並定期插入參考儲存以提升效能。
訊息會儲存在資料日誌中,而資料日誌是個別檔案,通常大小為 32mb (雖然這是可設定的,如果訊息大小大於檔案大小,則檔案可能會更大)。當資料日誌中的所有訊息都已成功使用後,該資料日誌檔案會標記為已準備好刪除 - 或封存 - 這會在下一個清理期間發生。
組態
預設情況下,ActiveMQ Classic 將會使用 AMQ 儲存及其預設設定。但是,您可以透過明確定義其持久性配接器 (amqPersistenceAdapter) 來設定 AMQ 儲存的屬性。
<broker brokerName="broker" persistent="true" useShutdownHook="false">
<persistenceAdapter>
<amqPersistenceAdapter directory="${activemq.base}/activemq-data" maxFileLength="32mb"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector uri="tcp://127.0.0.1:61616"/>
</transportConnectors>
</broker>
上述顯示了透過 amqPersistenceAdapter 設定 AMQ 儲存所需的組態 - 以及明確設定 directory 和 maxFileLength 屬性。
AMQ 儲存屬性
屬性名稱 | 預設值 | 註解 |
---|---|---|
directory |
activemq-data | 用於儲存訊息儲存資料和日誌檔案的目錄路徑 |
useNIO |
true | 使用 NIO 將訊息寫入到資料日誌 |
syncOnWrite |
false | 將每次寫入同步到磁碟 |
maxFileLength |
32mb | 設定訊息資料日誌最大大小的提示 |
persistentIndex |
true | 使用訊息日誌的持久性索引。如果此值為 false,則會維護一個記憶體中的結構 |
maxCheckpointMessageAddSize |
4kb | 在自動提交之前,交易中要保留的最大訊息數量 |
cleanupInterval |
30000 | 檢查是否要捨棄/移動不再使用的訊息資料日誌的時間 (毫秒) |
indexBinSize |
1024 | 索引使用的預設 bin 數量。bin 大小越大 - 索引的相對效能就越好 |
indexKeySize |
96 | 索引鍵的大小 - 索引鍵是訊息 ID |
indexPageSize |
16kb | 索引頁面的大小 - 頁面越大 - 索引的寫入效能越好 |
directoryArchive |
archive | 用於儲存已捨棄的資料日誌的目錄路徑 |
archiveDataLogs |
false | 如果為 true,則資料日誌會移動到封存目錄,而不是被刪除 |
資料結構
在為 AMQ 儲存定義的資料目錄中,具有以下目錄結構
頂層
訊息代理的名稱用於區分其訊息資料目錄。預設情況下,代理名稱為本機主機。
在此頂層目錄下方是以下子目錄
archive
訊息資料日誌在捨棄時會移動到此處。
注意:僅當啟用屬性 archiveDataLogs 時,此目錄才會存在
journal
用於保存訊息資料日誌
kr-store
Kaha 參考儲存的目錄結構 (如果使用)
data
用於參考日誌中訊息資料日誌的索引,以便快速檢索
state
儲存的狀態 - 即持久訂閱者的名稱 - 其原因在 復原 中說明
tmp-storage
用於保存可能儲存在磁碟上的暫時訊息的資料檔案,以減輕記憶體消耗 - 例如,等待傳遞給作用中但速度較慢的訂閱者的非持久主題訊息。
復原
如果訊息代理未正確關閉,則會清除參考儲存索引,並重新執行訊息資料檔案 (其中包含訊息/確認和交易界限) 以重新建立訊息儲存狀態。如果使用 Kaha 參考儲存 (預設),則可以透過刪除 kr-store/state/ 目錄來強制自動復原。