ActiveMQ持久化机制

        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集群搭建中说明。



猜你喜欢

转载自blog.csdn.net/it_lihongmin/article/details/80874062
今日推荐