info:当前的版本为apache-activemq-5.15.0
为保证消息系统的可靠性,保证消息中心宕机等不影响消息的发送,ActiceMQ提供四种持久化机制。在ActiveMQ安装目录下的conf/activemq.xml是一个spring的配置文件,在
在5.3版本及以前,AvtiveMQ默认使用AMQ的持久化策略。可以在activemq.xml中进行配置:
AMQ具有以下特点:
AMQ的性能改与JDBC的持久化机制,由于是在文件中追加写入消息,所以性能比较高。并且创建了消息主键索引和缓存机制以提升性能。每个日志文件默认为32M,超出后会创建一个新文件。当消息消费完成后是进行删除还是归档操作,取决于配置。
AMQ会为每一个Destination创建一个索引,若创建了大小的消息队列,则磁盘占用会非常大;所以由于索引文件比较大,当Broker崩溃后,重建所以速度比较慢。
从5.4版本开始ActiveMQ使用KahaDB作为默认的持久化机制,可以在activemq.xml中进行如下配置:
则在安装目录下data/kahadb下为文件形式的持久化消息,如下:
KahaDB具有以下特点:
KahaDb的恢复时间远小于AMQ,但是同样是基于文件存储方式,并且使用了索引和缓存。
在activemq.xml的broker中配置jdbc的持久化方式,由于是基于spring的配置文件,索引可以添加一个数据源的
由于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的持久化机制,一般用于集群中进行使用。需要引入Zookeeper进行协调和选举mater。基于LevelDB方式的持久化机制,性能会比较高,可以在ActiveMQ集群搭建中说明。