引言
ActiveMQ在不提供持久化的情況下,數據保存在內存中,一旦應用崩潰或者重啓之後,數據都將會丟失,這顯然在大部分情況下是我們所不希望的。對此ActiveMQ提供了兩種持久化方式以供選擇。
一、kahaDB
kahaDB是一個基於文件,支持事務的、可靠,高性能,可擴展的消息存儲器,目前是activeMQ默認的持久化方式,配置也十分簡單
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
以上配置是將存儲目錄設置爲${activemq.data}/kahadb,到存儲目錄下查看會發現以下文件
- db.data
索引文件,本質上是BTree的實現,存儲到了db-*.log消息文件的索引。 - db.redo
用來進行數據恢復的redo文件 - db-*.log
存儲消息內容的文件,包括消息元數據、訂閱關係、事務等數據。 - lock
kahaDB配置支持的參數有:
- indexWriteBatchSize
默認值1000,當緩存中更新的索引到達1000時,將數據同步到磁盤中,數據是批量同步的。 - indexCacheSize
默認值10000,在內存中最多分配多個頁面來緩存索引。緩存的索引越多,命中的概率就越大,檢索的效率就越高 - journalMaxFileLength
默認值32MB,配置單個消息文件的大小,超過一定大小以後重新創建一個新的文件進行保存。 - enableJournalDiskSyncs
默認值true,表示採用同步寫磁盤,即消息先存儲到磁盤後再向Producer返回ACK - cleanupInterval
默認值30s,當消息被消息者成功消費之後,Broker就可以將消息刪除的時間間隔。 - checkpointInterval
默認值5s,每隔5s將內存中的index緩存更新到磁盤文件中。
Database
除了kahaDB外,activeMQ還支持將數據持久化到數據庫中,配置也十分簡單,在conf/activemq.xml中增加如下配置:
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds"/>
</persistenceAdapter>
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value=""/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>