ActiveMQ-消息存储

来源:互联网 发布:编程安装软件 编辑:程序博客网 时间:2024/05/29 10:06

ActiveMQ不仅支持persistent和non-persistent两种方式,还支持消息的恢复( recovery )方式

Queue的存储是很简单的,就是一个FIFO的Queue
对于持久化订阅主题,每一个消费者将获得一个消息的复制。

消息存储的方式

ActiveMQ提供了一个插件式的消息存储,类似于消息的多点传播

AMQ消息存储

基于文件的存储方式,是以前的默认消息存储

KahaDB消息存储

KahaDB消息存储-提供了容量的提升和恢复能力,是现在的默认存储方式
KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址。
KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化。在Kaha中,数据被追加到data logs中。当不再需要log文件中的数据的时候,log文件会被丢弃。

KahaDB基本配置例子
<persistenceAdapter><kahaDB directory="${activemq.data}/kahadb"/></persistenceAdapter>
KahaDB消息存储属性

director:KahaDB存放的路径,默认值activemq-data
indexWriteBatchSize: 批量写入磁盘的索引page数量,默认值1000
indexCacheSize:内存中缓存索引page的数量,默认值10000
enableIndexWriteAsync:是否异步写出索引,默认false
journalMaxFileLength:设置每个消息data log的大小,默认是32MB
enableJournalDiskSyncs:设置是否保证每个没有事务的内容,被同步写入磁盘,JMS持久化的时候需要,默认为true
cleanupInterval:在检查到不再使用的消息后,在具体删除消息前的时间,默认30000
checkpointInterval:checkpoint的间隔时间,默认5000
ignoreMissingJournalfiles:是否忽略丢失的消息日志文件,默认false
checkForCorruptJournalFiles:在启动的时候,将会验证消息文件是否损坏,默认false
checksumJournalFiles:是否为每个消息日志文件提供checksum,默认false
archiveDataLogs: 是否移动文件到特定的路径,而不是删除它们,默认false
directoryArchive:定义消息已经被消费过后,移动data log到的路径,默认null
:databaseLockedWaitDelay:获得数据库锁的等待时间 (used by shared master/slave),默认10000
maxAsyncJobs:设置最大的可以存储的异步消息队列,默认值10000,可以和concurrentMessageProducers 设置成一样的值
concurrentStoreAndDispatchTransactions:是否分发消息到客户端,同时事务存储消息,默认true
concurrentStoreAndDispatchTopics:是否分发Topic消息到客户端,同时进行存储,默认true
concurrentStoreAndDispatchQueues:是否分发queue消息到客户端,同时进行存储,默认true

JDBC消息存储

JDBC消息存储-消息基于JDBC存储的

<beans><broker brokerName="test-broker" persistent=true xmlns="http://activemq.apache.org/schema/core"><persistenceAdapter><jdbcPersistenceAdapter dataSource=“#mysql-ds"/>          </persistenceAdapter>    </broker><bean name="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"><value>org.gjt.mm.mysql.Driver</value></property> <propertyname="url"><value>jdbc:mysql://192.168.1.100:3306/test?useUnicode=true&amp;characterEncodi ng=UTF-8</value></property><property name="username"> <value>root</value> </property><property name="password" value="cc"/> </bean>

JDBC Message Store with ActiveMQ Journal
这种方式克服了JDBC Store的不足,使用快速的缓存写入技术,大大提高了性能

<beans><broker brokerName="test-broker" xmlns="http://activemq.apache.org/schema/core"><persistenceFactory> <journalPersistenceAdapterFactoryjournalLogFiles="4" journalLogFileSize="32768" useJournal="true" useQuickJournal="true" dataSource="#derby-ds" dataDirectory="activemq-data" /></persistenceFactory> </broker></beans>

JDBC Store和JDBC Message Store with ActiveMQ Journal的区别
1:Jdbc with journal的性能优于jdbc
2:Jdbc用于master/slave模式的数据库分享
3:Jdbc with journal不能用于master/slave模式
4:一般情况下,推荐使用jdbc with journal

Memory 消息存储

Memory 消息存储-基于内存的消息存储
内存消息存储主要是存储所有的持久化的消息在内存中。这里没有动态的缓存存在,所以你必须注意设置你的broker所在的JVM和内存限制

<beans><broker brokerName="test-broker" persistent="false" xmlns="http://activemq.apache.org/schema/core"><transportConnectors><transportConnector uri="tcp://localhost:61635"/></transportConnectors> </broker></beans>
0 0