一、ActiveMQ的消息存储持久化方式
1.AMQ消息存储-基于文件的存储方式,以前的默认存储机制
2.KahaDB消息存储-提供了容量的提升和恢复能力,是现在的默认存储方式
3.JDBC存储-基于数据库方式
4.Memory存储-基于内存的,重启后消失
二、KahaDB介绍
KahaDB是目前默认的存储方式,可使用于任何场景,提高了性能和恢复能力。消息存储使用了一个事务日志和仅仅用一个索引文件来存储它所有的地址。
KahaDB是一个专门针对消息持久化的解决方案,他对典型的消息使用模式进行了优化。在Kaha中,数据被追加到data logs中。当不再需要log文件中数据的时候,log文件会被丢弃。
配置位置
在conf/activemq.xml中
基本配置例子:
</broker><broker brokerName="broker" ... >
<persistenceAdapter>
<kahaDB directory="${activemq-data}/kahadb" journalMaxFileLength="32mb"/>
</persistenceAdapter>
...
</broker>
上面是简单的配置,其实kahaDB还有很多属性可以配置,下面是属性列表和默认值:
属性名字 | 默认值 | 属性含义 |
---|---|---|
directory | activemq-data | 消息文件和日志的存储目录 |
indexWriteBatchSize | 1000 | 一批索引的大小,当要更新的索引量到达这个值时,更新到消息文件中 |
indexCacheSize | 10000 | 内存中,索引的页大小 |
enableIndexWriteAsync | false | 索引是否异步写到消息文件中 |
journalMaxFileLength | 32mb | 一个消息文件的大小 |
enableJournalDiskSyncs | true | 是否讲非事务的消息同步写入到磁盘 |
cleanupInterval | 30000 | 清除操作周期,单位ms |
checkpointInterval | 5000 | 索引写入到消息文件的周期,单位ms |
ignoreMissingJournalfiles | false | 忽略丢失的消息文件,false,当丢失了消息文件,启动异常 |
checkForCorruptJournalFiles | false | 检查消息文件是否损坏,true,检查发现损坏会尝试修复 |
checksumJournalFiles | false | 产生一个checksum,以便能够检测journal文件是否损坏。 |
archiveDataLogs | false | 当为true时,归档的消息文件被移到directoryArchive,而不是直接删除 |
directoryArchive | null | 存储被归档的消息文件目录 |
databaseLockedWaitDelay | 10000 | 在使用负载时,等待获得文件锁的延迟时间,单位ms |
maxAsyncJobs | 10000 | 同个生产者产生等待写入的异步消息最大量 |
concurrentStoreAndDispatchTopics | false | 当写入消息的时候,是否转发主题消息 |
concurrentStoreAndDispatchQueues | true | 当写入消息的时候,是否转发队列消息 |
三、JDBC方式
对于很多偏爱数据库的人来说,没有什么比把数据放到数据库更令人放心的了,所有这里简单介绍下jdbc方式,首先也是配置
配置
一样是在在conf/activemq.xml中,这里以mysql为例
<beans>
<broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>
</persistenceAdapter>
</broker>
<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="activemq"/>
<property name="password" value="activemq"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
</beans>
数据库表设置
activemq_msgs用于存储消息,Queue和Topic都存储在这个表中|
表字段 | 字段含义 |
---|---|
ID | 自增的数据库主键 |
CONTAINER | 消息的Destination |
MSGID_PROD | 消息发送者客户端的主键 |
MSG_SEQ | 是发送消息的顺序,MSGID_PROD+MSG_SEQ可以组成JMS的MessageID |
EXPIRATION | 消息的过期时间,存储的是从1970-01-01到现在的毫秒数 |
MSG | 消息本体的Java序列化对象的二进制数据 |
PRIORITY | 优先级,从0-9,数值越大优先级越高 |
activemq_acks用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存|
表字段 | 字段含义 |
---|---|
CONTAINER | 消息的Destination |
SUB_DEST | 如果是使用Static集群,这个字段会有集群其他系统的信息 |
CLIENT_ID | 每个订阅者都必须有一个唯一的客户端ID用以区分 |
SUB_NAME | 订阅者名称 |
SELECTOR | 选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,可支持多属性AND和OR操作 |
LAST_ACKED_ID | 记录消费过的消息的ID。 |
activemq_lock在集群环境中才有用,只有一个Broker可以获得消息,称为Master Broker
其他的只能作为备份等待Master Broker不可用,才可能成为下一个Master Broker。
这个表用于记录哪个Broker是当前的Master Broker。