ActiveMQ不仅支持persistent和non-persistent两种方式,而其ActiveMQ还支持消息的recovery(恢复)方式。
消息发送到Queue和Topic的存储原理和结构是不同的,ActiveMQ主要支持以下几种方式:
· AMQ消息存储-默认的消息存储。
· KahaDB消息存储-提供了容量的提升和恢复能力。
· JDBC消息存储-消息基于JDBC存储。
· Memory消息存储-基于内存的消息存储。
AMQ Message Store
AMQ Message Store是ActiveMQ5.0及以上版本缺省的持久化存储。它是一个基于文件、事务存储设计为快速消息存储结构。AMQ消息存储是一种可嵌入的事务性消息存储解决方案,具有极高的速度和可靠性。消息命令被写入事务日志(包含滚动数据日志),这意味着写入速度非常快,并且存储状态很容易恢复。
Message被保存到data logs中,data logs由多个日志文件data log组成,通常大小为32MB,若某消息大小超过32MB,可以修改配置增加data log的大小。在Message写入data logs时,同时会被Reference Store Indexes索引,以增加日志查询速度。Message被消费时,data log内条目会被标记,若data log内所有消息均被消费,data log整体被标记。
AMQ配置:
使用AMQ Message Store需修改activemq.xml中broker内persistenceAdapter节点:
<broker brokerName="broker" persistent="true" useShutdownHook="false">
<persistenceAdapter>
<amqPersistenceAdapter
directory="${activemq.base}/activemq-data"
maxFileLength="32mb"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector uri="tcp://localhost:61616"/>
</transportConnectors>
</broker>
除了在配置文件中配置外,还可以通过编码方式配置AMQ:
BrokerService broker = new BrokerService();
PersistenceAdapterFactory persistenceFactory = new AMQPersistenceAdapterFactory();
persistenceFactory.setMaxFileLength(1024*16);
persistenceFactory.setPersistentIndex(true);
persistenceFactory.setCleanupInterval(10000);
broker.setPersistenceFactory(persistenceFactory);
broker.addConnector("tcp://localhost:61616");
broker.start();
amqPersistenceAdapter节点属性:
属性名 | 默认值 | 注释 |
---|---|---|
directory | activemq-data | 用于指定消息存储日志文件的目录。 |
useNIO | true | 使用NIO将消息写入日志。 |
syncOnWrite | false | 同步每次写入磁盘。 |
maxFileLength | 32mb | 日志文件的最大大小。 |
persistentIndex | true | 对消息日志使用持久索引。如果设置为false,使用内存维护结构。 |
maxCheckpointMessageAddSize | 4kb | 自动提交之前保留在事务中的最大消息数。 |
cleanupInterval | 30000 | 检查丢弃/移动消息数据日志之前的等待时间(毫秒)。 |
indexBinSize | 1024 | 索引使用的默认位数,位数越大,性能越好。 |
indexKeySize | 96 | 索引键大小-键是消息ID。 |
indexPageSize | 16kb | 索引页大小,索引页越大,性能越好。 |
directoryArchive | archive | 用于存储丢弃的数据日志的目录的路径 |
archiveDataLogs | false | 如果将真实的数据日志移至归档目录而不是被删除 |
AMQ数据结构:
· broker name:消息代理的名称用于区分其消息数据目录。默认情况下,代理名称是本地主机。
· archive:消息日志数据移除后会存储在此,这个目录只有在archiveDataLogs=true才存在。
· journal:消息日志数据会存储在此。如果某些消息长时间不适用,将会被移除或存档。
· kr-store:主要存储AMQ Message Store的映射部分。它默认用Kaha数据库去索引和映射消息在journal目录中。
· data:用于消息日志数据索引存储、在journal目录中用于映射消息的集合。
· state:用于存储持久化订阅的消息日志,以便日后恢复使用。
· tmp-storage:用于保存临时消息的数据文件,这些消息可以存储在磁盘上以减轻内存消耗,例如,非持久性主题消息,等待传递给活动但速度较慢的订户。