AMQ消息存儲和KahaDB相似,具備保障可靠持久化的事務日誌以及搞性能索引,於是當消息吞吐量是主要需求時,應用程序使用這種消息存儲是最好的選擇.可是由於AMQ消息存儲中每一個索引都使用
連個文件,並且爲每個消息目的地都單獨使用索引,因此當每一個代理中會產生大量的消息隊列是不該該使用AMQ消息存儲.一樣,使用這種消息存儲代理從非正常關閉中恢復會比較慢.緣由是代理
恢復時,全部的的索引須要重建,這就要求代理遍歷它的數據日誌文件以便正確的重建索引.
5.3.1 深刻AMQ消息存儲
AMQ消息的存儲的主要組成部分和KahaDB消息存儲相似,包括緩存,以及用於按順序存取消息數據日誌文件
的引用.AMQ消息存儲包含一下三個獨立部分:
數據日誌文件 — 該文件保存消息引用,這些消息已根據消息ID創建了索引
緩存 — 在消息被寫入數據日誌文件後,緩存是在內存中保存這些消息以便快速讀取這些消息
引用存儲 — 引用存儲是掉數據日誌中消息的引用,這些消息已經根據消息ID創建了索引
5.3.2 AMQ消息存儲的目錄結構
當你啓動一個配置了AMQ的ActiveMQ代理,一個用於保存持久化消息的目錄會被自動建立.AMQ消息存儲目錄包含了一些子目錄,每個子目錄對應一個在本機上運行的代理.所以,建議
給不一樣的代理取不一樣的名稱.ActiveMQ的默認配置中,broker的name屬性爲localhost,這個須要
修改爲一個惟一值.
目錄結構
lock文件 — 保證任什麼時候刻只有一個代理能夠存取這個數據.lock一般用於雙擊人備份環境,此時系統中可能
temp文件存儲目錄 — 用於存儲不能在代理的內存中駐留的非持久化信息.這些消正在等待被髮送到速度較慢的消息消費者.
kr-store目錄 — 改目錄用於AMQ消息存儲的引用(索引)部分.默認時使用Kaha引用存儲(Kaha是ActiveMQ核心庫的一部分),以創建數據
日誌文件中消息索引的引用.kr-store包含一下兩個獨立部分:
數據日誌目錄 — 數據文件(保存數據日誌)和數據控制文件(保存一些元數據信息).數據文件會被引用計數,所以當文件中包含的全部消息
都被分發了時,改數據文件會被刪除或歸檔.
歸檔目錄 — 只有啓用歸檔時才產生歸檔目錄.默認狀況下,歸檔目錄和數據日誌目錄同級(即和journal目錄在一塊兒).
歸檔目錄應該放到其餘系統分區或者磁盤上(不要與journal放在一塊兒).歸檔文件用來保存journal中再也不使用的
數據日誌文件(若是不歸檔的話,這些數據日誌文件原本應該會被刪除).這樣就能夠在之後重播已經處理過的消息.
要重播消息,能夠移動歸檔後的數據日誌文件(或該文件的一部分)到一個新的journal目錄,而後啓動一個指向
這個新journal目錄的代理,而後這個新啓動的代理會自動重播這個journal中的消息
MQ的基礎內已經介紹完畢,接下來看看如何配置AMQ消息存儲.
5.3.3 配置AMQ消息存儲
經過配置AMQ消息存儲,用戶能夠修改它的基本行爲,包括索引創建,執行checkpoint的時間間隔和日誌數據文件大小.
這些條目還有其餘不少條目均可以經過屬性自定義.AMQ消息存儲的主要屬性如表5.2所示:
屬性名稱 默認值 描述
directory activemq-data AMQ消息存儲使用的目錄
useNIO true JDK的NIO能夠更快的寫入文件到系統磁盤
syncOnWrite false 是否同步全部的磁盤寫操做
syncOnTransaction true 是否同步全部的事務寫操做
maxFileLength 32mb 日誌數據文件的最大尺寸,超過這個值將建立一個新文件
persistentIndex true 是否使用持久化索引.若是設置爲false,將使用內存中的HashMap做爲替代.
maxCheckpointMessageAddSize 4kb 單個事務可以使用的最大內存大小,超過這個值數據會被寫入磁盤
cleanupInterval 3000(ms) 進行日誌數據文件是否須要的檢查操做 的時間間隔(不須要的數據日誌文件會被刪除或歸檔(配置了歸檔時))
checkpointInterval 20000(ms) checkpoint的時間間隔,緩存的消息ID在內存中存在的時間,超過這個時間緩存被寫入索引文件
indexBinSize 1024 用於索引的哈希容器的初始化大小
indexMaxBinSize 16384 哈希容器容量的最大值
directoryArchive archive 歸檔目錄,AMQ消息存儲用來存放歸檔文件的地方
archiveDataLogs false 是否啓用歸檔.若啓用,不用的日誌文件會被移動到規定目錄,而不是刪除掉.
recoverReferenceStore true 若是代理非正常關閉,是否恢復索引存儲. 這個選項須要謹慎配置
forceRecoverReferenceStore false Forces a recovery of the reference store.
下面是使用表5.2中列出的屬性,配置ActiveMQ的XML代碼示例:
<?xml version=」1.0″ encoding=」UTF-8″?>
<beans>
<broker xmlns=」http://activemq.apache.org/schema/core」>
<persistenceAdapter>
<amqPersistenceAdapter
directory=」target/Broker2-data/activemq-data」
syncOnWrite=」true」
indexPageSize=」16kb」
indexMaxBinSize=」100″
maxFileLength=」10mb」 />
</persistenceAdapter>
</broker>
</beans>
與KahaDB同樣,AMQ消息存儲也容許用戶快速使用,由於這種消息存儲方式不須要
依賴外部的其餘數據庫.可是,假如你想使用已有的關係數據庫來運行ActiveMQ代理,你須要
使用JDBC消息存儲.
數據庫