ActiveMQ的持久化存储机制

一、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还有很多属性可以配置,下面是属性列表和默认值:

属性名字默认值属性含义
directoryactivemq-data消息文件和日志的存储目录
indexWriteBatchSize1000一批索引的大小,当要更新的索引量到达这个值时,更新到消息文件中
indexCacheSize10000内存中,索引的页大小
enableIndexWriteAsyncfalse索引是否异步写到消息文件中
journalMaxFileLength32mb一个消息文件的大小
enableJournalDiskSyncstrue是否讲非事务的消息同步写入到磁盘
cleanupInterval30000清除操作周期,单位ms
checkpointInterval5000索引写入到消息文件的周期,单位ms
ignoreMissingJournalfilesfalse忽略丢失的消息文件,false,当丢失了消息文件,启动异常
checkForCorruptJournalFilesfalse检查消息文件是否损坏,true,检查发现损坏会尝试修复
checksumJournalFilesfalse产生一个checksum,以便能够检测journal文件是否损坏。
archiveDataLogsfalse当为true时,归档的消息文件被移到directoryArchive,而不是直接删除
directoryArchivenull存储被归档的消息文件目录
databaseLockedWaitDelay10000在使用负载时,等待获得文件锁的延迟时间,单位ms
maxAsyncJobs10000同个生产者产生等待写入的异步消息最大量
concurrentStoreAndDispatchTopicsfalse当写入消息的时候,是否转发主题消息
concurrentStoreAndDispatchQueuestrue当写入消息的时候,是否转发队列消息

三、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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值