消息存儲持久化:
ActiveMQ不僅支持persistent和non-persistent兩種方式,還支持消息的恢復( recovery )方式
PTP: Queue的存儲是很簡單的,就是-一個FIFO的Queue
PUB/SUB: 對於持久化訂閱主題,每一個消費者將獲得一個消息的複製。
-
有效的消息存儲:
ActiveMQ提供了-一個插件式的消息存儲,類似於消息的多點傳播,主要實現瞭如下幾種:
1: AMQ消息存儲-基於文件的存儲方式,是以前的默認消息存儲
2: KahaDB消息存儲-提供了容量的提升和恢復能力,是現在的默認存儲方式
3:JDBC消息存儲-消息基於JDBC存儲的
4:Memory消息存儲-基於內存的消息存儲- KahaDB Message Store概述:
KahaDB是目前默認的存儲方式,可用於任何場景,提高了性能和恢復能力。消息存儲使用一個事務日誌和僅僅用一個索引文件來存儲它所有的地址。
KahaDB是一個專門針對消息持久化的解快方案,它對典型的消息使用模式進行了優化。在Kaha中,數據被追加到datalogs中。當不再需要log文件中的數據的時候,log文件會被丟棄。
KahaDB基本配置例子:
默認的位置在activemq/data/kahadb
db-x.log files: 以db-遞增數字.log命名。
archive directory: 當配置支持archiving(默認不支持)並且存在,該文件夾纔會創建。用於存儲不再需要的data logs。
db.data: 存儲btree索引
db.redo: 用於hard-stop broker後,btree索引的重建
可用屬性:
名稱 | 含義 |
---|---|
director | KahaDB存放的路徑,默認值activemq-data |
indexWri teBatchSize | 批量寫入磁盤的索弓lpage數量, 默認值1000 |
indexCacheSize | 內存中緩存索引page的數量,默認值10000 |
enableIndexWri teAsync | 是否異步寫出索引,默認false |
journalMaxFileLength | 設置每個消息data log的大小,默認是32MB |
enableJournalDiskSyncs | 設置是否保證每個沒有事務的內容,被同步寫入磁盤,JMS持久化的時候需要,默認爲true |
cleanupInterval | 在檢查到不再使用的消息後,在具體刪除消息前的時間,默認30000 |
checkpo intInterval | checkpoint 的間隔時間,默認5000 |
ignoreMi ssingJournalfiles | 是否忽略丟失的消息日誌文件,默認false |
checkForCorruptJournalFiles | 在啓動的時候,將會驗證消息文件是否損壞,默認false |
checksumJournalFiles | 是否爲每個消息日誌文件提供checksum,默認false |
archiveDa taLogs | 是否移動文件到特定的路徑,而不是刪除它們,默認false |
directoryArchive | 定義消息已經被消費過後,移動data log到的路徑,默認null |
databaseLockedWai tDelay | 獲得數據庫鎖的等待時間(used by shared master/slave), 默認10000 |
maxAsyncJobs | 設置最大的可以存儲的異步消息隊列,默認值10000,可以和concurrentMe ssageProducers設置成一樣的值 |
concurrentS toreAndDi spa tchTransactions | 是否分發消息到客戶端,同時事務存儲消息,默認true |
concurrentS toreAndDi spatchTopics | 是否分發Topic消息到客戶端,同時進行存儲,默認true |
concurrentS toreAndDi spa tchQueues | 是否分發queue消息到客戶端,同時進行存儲,默認true |
-
使用JDBC持久化消息:
默認表名:activemq,會自動建表
配置:
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#activemq-mysql" />
</persistenceAdapter>
<!-- 這個需要放在broker標籤結束的地方 -->
<bean id="activemq-mysql" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.0.102:3306/activemq?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
需要給activemq/lib增加Mysql的jar
- JDBC Message Store with ActiveMQ Jonrnal:
這種方式克服了JDBC Store的不足,使用快速的緩存寫入技術,大大提高了性能。配置示例如下:
<persistenceFactory>
<journalPersistenceAdapterFactory
journalLogFiles="4"
journalLogFileSize="32768"
useJournal="true"
useQuickJournal="true"
dataSource="#activemq-mysql"
dataDirectory="activemq-data" />
</persistenceFactory>
使用這個,其實是相當於,發送的消息先寫入到內存中,日誌文件中。然後在寫入到數據庫中。
JDBC Store和JDBC Message Store with ActiveMQ Journal 的區別:
1: Jdbc wi th journal的性能優於jdbc
2: Jdbc用於master/slave模式的數據庫分享
3: Jdbc with journal不能用於master/slave模式
4: 一般情況下,推薦使用jdbc with journal
- Memory Message Store:
內存消息存儲主要是存儲所有的持久化的消息在內存中。這裏沒有動態的緩存存在,需要注意設置broker的jvm和內存限制,配置如下: