ActiveMQ不仅支持persistent和non-persistent两种方式,而其ActiveMQ还支持消息的recovery(恢复)方式。
消息发送到Queue和Topic的存储原理和结构是不同的,ActiveMQ主要支持以下几种方式:
· AMQ消息存储-默认的消息存储。
· KahaDB消息存储-提供了容量的提升和恢复能力。
· JDBC消息存储-消息基于JDBC存储。
· Memory消息存储-基于内存的消息存储。
KahaDB Message Store
KahaDB是基于文件的持久性数据库,它针对快速持久化做了优化。与AMQ Message Store相比,KahaDB使用的文件描述符更少,且恢复速度更快,KahaDB Message Store提升了容量和恢复能力(5.3及以上版本)。
KahaDB 配置:
<broker brokerName="broker">
<persistenceAdapter>
<kahaDB directory="activemq-data" journalMaxFileLength="32mb"/>
</persistenceAdapter>
</broker>
kahaDB节点属性:
属性名 | 默认值 | 注释 |
---|---|---|
archiveCorruptedIndex | false | 若为true,在启动时发现的损坏索引存档(不删除)。 |
archiveDataLogs | false | 若为true,将消息数据日志存档(不删除)。 |
checkForCorruptJournalFiles | false | 若为true,在启动时检查损坏的日志文件并尝试修复。 |
checkpointInterval | 5000 | 检查点的间隔时间(毫秒)。 |
checksumJournalFiles | true | 创建日志文件的校验和。在5.9.0版本前,默认为false。 |
cleanupInterval | 30000 | 清理操作的间隔时间(毫秒)。 |
compactAcksAfterNoGC | 10 | 5.14.0版本开始,启动确认 |
数据结构:
KahaDB Message Store的存储结构和AMQ的存储结构类似。包括Cache、BTree Indexes、Redo Log、Data Logs。所有的索引文件都记录在Redo Logs中,这样更新数据时,仅更新存在变化的数据即可。
KahaDB配置:
<broker brokerName="broker" persistent="true" userShutdownHook=false>
<persistenceAdapter>
<kahaDB directory="activemq-data" journalMaxFileLength="32"/>
</persistenceAdapter>
<transportConnectors>
<transortConnector uri="tcp://localhost:61616"/>
</transportConnectors>
</broker>
kahaDB属性:
属性名 | 默认值 | 注释 |
---|---|---|
directory | activemq-data | 保存消息数据和日志文件的目录。 |
indexWriteBatchSize | 1000 | 批量写入的索引数。 |
indexCacheSize | 100 | 内存中缓存的索引页数。 |
enableIndexWriteAsync | false | 若为true,索引将异步更新。 |
journalMaxFileLength | 32mb | 设置消息数据日志的最大大小的提示。 |
enableJournalDiskSyncs | true | 确保每次日志写入后都进行磁盘同步。 |
maxCheckpointMessageAddSize | 4kb | 每次事务自动提交前事务中可以把保存的消息数。 |
cleanupInterval | 30000 | 清理操作的间隔时间(毫秒)。 |
checkpointInterval | 5000 | 检查点的间隔时间(毫秒)。 |
应用场景:
KahaDB相比与AMQ消息存储能够应用到任何情况下。如果需要应用在broker不超过500个情况下,那么AMQ消息存储是最好的选择。
需要注意的是,尽管KahaDB消息存储和AMQ消息存储结构十分相似,但依然存在差别,两者之间无法做到无缝切换,如果现在使用的AMQ,需要切换到KahaDB,那么需要移除AMQ。