info:当前的版本为apache-activemq-5.15.0
为保证消息系统的可靠性,保证消息中心宕机等不影响消息的发送,ActiceMQ提供四种持久化机制。在ActiveMQ安装目录下的conf/activemq.xml是一个spring的配置文件,在<broker>下有<persistenceAdapter>可以配置持久化适配开启不同的持久化机制,默认为kahaDB方式。
一、AMQ持久化机制
在5.3版本及以前,AvtiveMQ默认使用AMQ的持久化策略。可以在activemq.xml中进行配置:
<persistenceAdapter>
<amqPersistenceAdapter directory="${activemq.data}/activemq-data" maxFileLength="32m"/>
</persistenceAdapter>
AMQ具有以下特点:
1、性能
AMQ的性能改与JDBC的持久化机制,由于是在文件中追加写入消息,所以性能比较高。并且创建了消息主键索引和缓存机制以提升性能。每个日志文件默认为32M,超出后会创建一个新文件。当消息消费完成后是进行删除还是归档操作,取决于配置。
2、缺点
AMQ会为每一个Destination创建一个索引,若创建了大小的消息队列,则磁盘占用会非常大;所以由于索引文件比较大,当Broker崩溃后,重建所以速度比较慢。
二、KahaDB持久化机制
从5.4版本开始ActiveMQ使用KahaDB作为默认的持久化机制,可以在activemq.xml中进行如下配置:
<!-- Configure message persistence for the broker. The default persistence
mechanism is the KahaDB store (identified by the kahaDB tag).
For more information, see:
http://activemq.apache.org/persistence.html
-->
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
则在安装目录下data/kahadb下为文件形式的持久化消息,如下:
KahaDB具有以下特点:
1、KahaDB与AMQ比较
KahaDb的恢复时间远小于AMQ,但是同样是基于文件存储方式,并且使用了索引和缓存。
2、消息索引使用B-tree结构存储
3、支持JMS事务
4、支持多种恢复机制
三、JDBC持久化机制
1、配置activemq.xml
在activemq.xml的broker中配置jdbc的持久化方式,由于是基于spring的配置文件,索引可以添加一个数据源的<bean>标签,如下:
<persistenceAdapter>
<!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<jdbcPersistenceAdapter dataSource="#mysqlDataSource" createTablesOnStartup="true"/>
</persistenceAdapter>
<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://47.93.250.91:3306/wordpress"/>
<property name="username" value="root"/>
<property name="password" value="825a90ae4096"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
2、添加依赖包
由于JDBC持久化方式需要连接数据库,所以需要在ActiveMQ安装目录的lib目录下添加以下jar包:
mysql-connector-java-5.1.35.jar
commons-pool-1.6.jar
commons-dbcp-1.4.jar
第一次可以createTablesOnStartup属性设置为true,用于反向建表。生成的表信息如下:
ACTIVEMQ_ACKS: 用于存储持久化订阅的信息
ACTIVEMQ_LOCK: 用于集群环境的时候,实现master的选举
ACTIVEMQ_MSGS: 用于存储消息
CREATE TABLE `ACTIVEMQ_ACKS` (
`CONTAINER` varchar(250) NOT NULL,
`SUB_DEST` varchar(250) DEFAULT NULL,
`CLIENT_ID` varchar(250) NOT NULL,
`SUB_NAME` varchar(250) NOT NULL,
`SELECTOR` varchar(250) DEFAULT NULL,
`LAST_ACKED_ID` bigint(20) DEFAULT NULL,
`PRIORITY` bigint(20) NOT NULL DEFAULT '5',
`XID` varchar(250) DEFAULT NULL,
PRIMARY KEY (`CONTAINER`,`CLIENT_ID`,`SUB_NAME`,`PRIORITY`),
KEY `ACTIVEMQ_ACKS_XIDX` (`XID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `ACTIVEMQ_LOCK` (
`ID` bigint(20) NOT NULL,
`TIME` bigint(20) DEFAULT NULL,
`BROKER_NAME` varchar(250) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `ACTIVEMQ_MSGS` (
`ID` bigint(20) NOT NULL,
`CONTAINER` varchar(250) NOT NULL,
`MSGID_PROD` varchar(250) DEFAULT NULL,
`MSGID_SEQ` bigint(20) DEFAULT NULL,
`EXPIRATION` bigint(20) DEFAULT NULL,
`MSG` longblob,
`PRIORITY` bigint(20) DEFAULT NULL,
`XID` varchar(250) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `ACTIVEMQ_MSGS_MIDX` (`MSGID_PROD`,`MSGID_SEQ`),
KEY `ACTIVEMQ_MSGS_CIDX` (`CONTAINER`),
KEY `ACTIVEMQ_MSGS_EIDX` (`EXPIRATION`),
KEY `ACTIVEMQ_MSGS_PIDX` (`PRIORITY`),
KEY `ACTIVEMQ_MSGS_XIDX` (`XID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
四、LevelDB持久化机制
基于LevelDB的持久化机制,一般用于集群中进行使用。需要引入Zookeeper进行协调和选举mater。基于LevelDB方式的持久化机制,性能会比较高,可以在ActiveMQ集群搭建中说明。