ActiveMQ的消息存储机制

jopen 5年前


/* 转载请注明作者longdick http://longdick.iteye.com

ActiveMQ是当下最流行和强大的开源企业消息集成组件。
ActiveMQ性能优良,支持多种跨语言的客户端和协议,支持JMS1.1和J2EE1.4,易于使用并且特性多多。
ActiveMQ基于Apache 2.0 License软件协议。


当前最新版本为5.2.0


最新特性:

  • 多语言多协议支持,Java、C、C++、C#可以通过OpenWire协议编写高效的客户端;
  • Stomp协议的支持使得我们可以用Ruby、Perl、Python、AS等等语言方便的编写客户端程序。
  • 通过集成Apache Camel 库,中间件和客户端可以完全支持Enterprise Integration Patterns(企业集成模式)
    支持许多高级特性如:消息群组(Message Groups)、虚拟端点(Virtual Destinations)、通配符(Wildcards)、复合端点(Composite Destinations)等
  • 完全支持JMS1.1和J2EE1.4规范包括对临时、持久、XA事务消息的支持
  • spring支持JMS规范,所以Acticemq可以集成到spring,集中管理。
  • 在支持J2EE1.4规范的多个流行J2EE服务器上通过测试。
  • 可插拔的传输协议支持 比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports
  • 支持超快的JDBC消息持久化和高效的日志系统
  • 为高效服务集群、客户服务机、基于点通信系统而设计。
  • REST-ful支持。
  • Ajax支持。
  • 对CXF和Axis的支持可以帮助Activemq通过web service来提供可靠的消息服务。
  • 等等。。。

ActiveMq5.2.0 对JDK的要求是 JDK 5 and later。如果要搭建MQ服务,那么在目标机器上必须设置JAVA_HOME变量,指向JDK的安装目录。


依赖:
要正常使用ActiveMq的功能至少需要activemq-core.jar、commons-logging.jar、J2EE API。



AMQ Message Store 是什么?

默认的activemq消息存储是通过一个所谓的AMQ Message Store来完成。
AMQ Message Store是一个高效的可嵌入支持事务的消息存储解决方案。
在此方案下消息(Message)本身以日志的形式实现持久化,存放在Data Log里。并且还对日志里的消息做了引用索引,方便快速取回Message。


一般情况下消息索引存放于内存(Cache)中,MQ Server定期将索引内容持久化,存放到Reference Store。
Message Data Log文件是有容量限制的,默认是32MB,可自行配置容量。当该Data Log文件里所有消息都被消费完的时候,Data Log文件就会被加上一个标记,通知下一次消息清理时可以被处理掉(处理方式可以是delete或是转移到Achieve目录)。


AMQ Message Store方案中 Cache 、Data Log、Reference Store 协作图如下:


AMQ Message Store的属性是可以配置的,
你可以在conf/activemq.xml配置文件里添加上如下配置:







<persistenceAdapter>   <amqPersistenceAdapter directory="activemq-data" maxFileLength="32mb"/>   </persistenceAdapter> 


属性说明

property name

default value

Comments

directory

activemq-data

存储消息文件和日志的目录

useNIO

true

使用 NIO 特性

syncOnWrite

false

同步写文件到磁盘

maxFileLength

32mb

Message Data日志文件的最大 Size

persistentIndex

true

持久化日志索引,如果设为 false ,则在内存中保存

maxCheckpointMessageAddSize

4kb

在自动提交前在事务中能保持的最大消息数

cleanupInterval

30000

每隔多少时间清理不再使用的消息日志(毫秒)

indexBinSize

1024

这个值是用来提升索引的性能的,值越大,索引相对性能越好

indexKeySize

96

index key的size,index key基于message id

indexPageSize

16kb

索引页的size

directoryArchive

archive

消费完的Data Log存放的目录

archiveDataLogs

false

设置为true的话,消费完的Data Log就放到Archive目录,而不是删除。

AMQ Message Store体系中 目录结构参照下图 :


顶层目录broker name
用broker name命名,默认目录名是localhost,broker name在activemq的配置文件里指定,以下是它的子目录:


archive
丢弃的Data Log就放到这里,当archiveDataLogs 属性配置为true时才会存在


journal
message data log的所在


kr-store
reference store 目录


data
引用索引所在目录


state
记录store的状态


tmp-storage
用来存储一些事物性的消息以减轻内存的负担例如等待正常但是速度很慢的消费端来消费非持久化的Topic.



其他持久化方式
activemq同样支持JDBC持久化Message,我们只需要把配置从


<persistenceAdapter>   <amqPersistenceAdapter directory="activemq-data" maxFileLength="32mb"/>  </persistenceAdapter>



改成AMQ Message Store and JDBC(推荐,同时使用两者可以同时保证效率和可靠性):


<persistenceAdapter>  <journaledJDBC dataDirectory="${activemq.base}/data" dataSource="#oracle-ds"/>  </persistenceAdapter>


或是 JDBC only(现阶段不推荐,单独的JDBC存储效率不高):



<persistenceAdapter>  <jdbcPersistenceAdapter dataSource="#oracle-ds"/>  </persistenceAdapter>



Oracle数据源的配置如下:


<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>        <property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>        <property name="username" value="scott"/>        <property name="password" value="tiger"/>        <property name="maxActive" value="200"/>        <property name="poolPreparedStatements" value="true"/>      </bean>


其他数据源配置参照Activemq的文档。



参考资料来自官方网站:
http://activemq.apache.org