> 文档中心 > activeMQ持久化消息和非持久化消息的存储原理

activeMQ持久化消息和非持久化消息的存储原理

正常情况下,非持久消息是存储在内存中的,持久化消息是存储在文件中的。能够存储的最大消息数在/conf/activemq.xml文件中的systemUsage节点配置,如下:

        //该子标记设置整个ActiveMQ节点的“可用内存限制”。这个值不能超过ActiveMQ本身设置的最大内存大小。其中的percentOfJvmHeap属性表示百分比。占用70%的堆内存          //该标记设置整个ActiveMQ节点,用于存储“持久化消息”的“可用磁盘空间”。该子标记的limit属性必须要进行设置          //一旦ActiveMQ服务节点存储的消息达到了memoryUsage的限制,非持久化消息就会被转储到 temp store区域,虽然我们说过非持久化消息不进行持久化存储,但是ActiveMQ为了防止“数据洪峰”出现时非持久化消息大量堆积致使内存耗尽的情况出现,还是会将非持久化消息写入到磁盘的临时区域——temp store。这个子标记就是为了设置这个temp store区域的“可用磁盘空间限制”  ,服务重启时写入到磁盘临时区域的数据不能被恢复              

activeMQ支持的持久化类型
1)KahaDB存储(默认存储方式
KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。消息存储使用一个事务日志 和 一个索引文件来存储它所有的地址。 配置方式:activemq.xml中

        

存储原理:kahadb数据目录下有四种文件
db.data: 消息的索引文件 ,本质上是B-Tree (与mysql索引结构类似)指向db-.log中的消息
db.redo: 用来进行消息恢复
db-
.log :储消息内容。新的数据以APPEND的方式追加到日志文件末尾。属于顺序写入,因此消息存储是比较快的。默认是32M,达到阀值会自动递增
lock: 锁,表示当前获得kahadb读写权限的broker

2)JDBC存储
使用JDBC持久化方式,数据库会创建3个表:activemq_msgs,activemq_acks和activemq_lock
activemq_msgs 消息表,queue和topic都存在这个表中
activemq_acks 存储持久订阅的信息和最后一个持久订阅接收的消息ID
activemq_lock 锁表,用来确保某一时刻,只能有一个ActiveMQ broker实例来访问数据库
配置方式
a) persistenceAdapter 配置

b)配置连接池信息

c )添加依赖的数据库连接jar包以及连接池jar包

3)Memory存储
不需要持久化 使用 配置方式

 

4)LevelDB存储
LevelDB持久化性能高于KahaDB,虽然目前默认的持久化方式仍然是KahaDB。并且,在ActiveMQ 5.9版本提供
了基于LevelDB和Zookeeper的数据复制方式,用于Master-slave方式的首选数据复制方案。
不过,据ActiveMQ官网对LevelDB的表述:LevelDB官方建议使用以及不再支持,推荐使用的是KahaDB
配置:

5)JDBC With ActiveMQ Journal
这种方式克服了JDBC Store的不足,JDBC持久化方式每次消息过来,都需要去写库和读库。ActiveMQ Journal,使用高速缓存写入技术,大大提高了性能。当消费者的消费速度能够及时跟上生产者消息的生产速度时,journal文件能够大大减少需要写入到DB中的消息。
举个例子,生产者生产了1000条消息,这1000条消息会保存到journal文件,如果消费者的消费速度很快的情况
下,在journal文件还没有同步到DB之前,消费者已经消费了90%的以上的消息,那么这个时候只需要同步剩余的
10%的消息到DB。
配置方式