ActiveMQ持久化

  ActiveMQ中,持久化是值对消息数据的持久化。在ActiveMQ中,默认的消息是保存在内存中的。当内存容量不足的时候,或ActiveMQ正常关闭的时候,会将内存中的未处理的消息持久化到磁盘中。具体的持久化策略是kahadb。若是使用JDBC做为持久化策略,则会将全部的须要持久化的消息保存到数据库中。mysql

  全部持久化配置都在conf/activemq.xml中配置,配置信息都在broker标签内部定义。sql

1、kahadb方式

  kahadb是ActiveMQ默认的持久化策略。kahadb是一个文件型数据库。是使用内存+文件保证数据的持久化的。kahadb能够限制每一个数据文件的大小。不表明总计数据容量。数据库

1 <persistenceAdapter>
2     <!--directory:保存数据的目录;journalMaxFileLength:保存消息的文件大小-->
3     <kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb" />
4 </persistenceAdapter>

  特性是:apache

  1,日志形式存储消息。缓存

  2,消息索引以B-Tree结构存储,能够快速更新。安全

  3,彻底支持JMS事物服务器

  4,支持多种恢复机制性能

2、AMQ方式

  只适用于5.3版本之前。url

  AMQ也是一个文件型数据库,消息信息最终是存储在存储文件中的,内存中也会有缓存数据。spa

1 <persistenceAdapter>
2     <!--directory:保存数据的目录;maxFileLength:保存消息的大小-->
3     <amqPersistenceAdapter directory="${activemq.data}/amq" maxFileLength="32mb" />
4 </persistenceAdapter>

  性能高于JDBC,写入消息时,会将消息写入日志文件,因为是顺序追加写,性能很高。为了提高性能,建立消息主键索引,而且提供缓存机制,进一步提高性能。每一个日志文件的大小都是有限制的(默认32m,可自行配置)。

  当超过这个大小,系统会从新创建一个文件,当全部的消息都消费完成,系统会删除这个文件或归档。

  主要缺点是AMQ Message会我每个destination建立一个索引,若是使用了大量的queue,索引文件的大小会占用不少的磁盘空间。

  并且因为索引巨大,一旦Broker(ActiveMQ的应用实例)崩溃,重建索引的速度会很是慢。

  虽然AMQ性能略高于Kahadb方式,但因为其重建索引时间过长,并且索引文件占用磁盘空间过大,已经再也不推荐使用。

3、JDBC持久化方式

  ActiveMQ将数据持久化到数据库中,不能限定具体的数据库,可使用任意的数据库,下边咱们以MySql为例。

  首先打开activemq.xml配置文件,首先定义一个mysql-ds的MySql数据源,而后在persistenceAdapter节点中配置jdbcPersistenceAdapter而且引用刚才定义的数据源。

  dataSource指定持久化的数据库bean,createTableOnStartUp是否在启动的时候建立数据库表,默认值是true,这样每次启动都会去建立数据库表了,通常是第一次启动的时候设置为true,以后改成false。

 1 <broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
 2     <persistenceAdapter>
 3         <jdbcPersistenceAdapter dataSource="#mysql-ds" createTabelsOnStartUp="false">
 4     </persistenceAdapter>
 5 </broker>
 6 <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 7     <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 8     <property name="url" value="jdbc:mysql://127.0.0.1/activemq?relaxAutoCommit=true" />
 9     <property name="username" value="activemq" />
10     <property name="password" value="activemq" />
11     <property name="maxActive" value="200" />
12     <property name="poolPreparedStatements" value="true" />
13 </bean>

  配置成功后,须要在数据库中建立对应的database,不然没法访问,表格ActiveMQ能够自动建立。

  数据表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 能够得到消息,称为MasterBroker,其余的只能做为备份等待Master Broker 不可用,才可能成为下一个Master Broker。这个表用于记录哪一个Broker 是当前的Master Broker。只有在消息必须保证有效,且绝对不能丢失的时候。使用JDBC 存储策略。若是消息能够容忍丢失,或使用集群/主备模式保证数据安全的时候,建议使用levelDB或Kahadb。

相关文章
相关标签/搜索