博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ActiveMQ 持久化
阅读量:5330 次
发布时间:2019-06-14

本文共 3126 字,大约阅读时间需要 10 分钟。

ActiveMQ 中,持久化是指对消息数据的持久化。在 ActiveMQ 中,默认的消息是保存 在内存中的。

当内存容量不足的时候,或 ActiveMQ 正常关闭的时候,会将内存中的未处理的消息持久化到磁盘中。

具体的持久化策略由配置文件中的具体配置决定。

ActiveMQ 的默认存储策略是 kahadb。如果使用 JDBC 作为持久化策略,则会将所有的

需要持久化的消息保存到数据库中。

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

1 kahadb 方式

是 ActiveMQ 默认的持久化策略。kahadb 是一个文件型数据库。是使用内存+文件保证

数据的持久化的。kahadb 可以限制每个数据文件的大小。不代表总计数据容量。

<persistenceAdapter>

    <!-- directory:保存数据的目录; journalMaxFileLength:保存消息的文件大小 -->

    <kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>

</persistenceAdapter

特性是:

1、日志形式存储消息;

2、消息索引以 B-Tree 结构存储,可以快速更新;

3、 完全支持 JMS 事务;

4、支持多种恢复机制;

 

文件位置:

${activemq.data}/kahadb

 

[root@clc kahadb]# pwd

/usr/activemq/apache-activemq-5.9.0/data/kahadb

[root@clc kahadb]# ll

总用量 32436

-rw-r--r--. 1 root root 33030144 1月  14 18:25 db-1.log

-rw-r--r--. 1 root root   126976 1月  14 18:25 db.data

-rw-r--r--. 1 root root    49240 1月  14 18:25 db.redo

-rw-r--r--. 1 root root        0 1月  14 01:33 lock

[root@clc kahadb]#

 

 

2 AMQ方式

只适用于 5.3 版本之前。

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

<persistenceAdapter>

    <!-- directory:保存数据的目录 ; maxFileLength:保存消息的文件大小 -->

    <amqPersistenceAdapter directory="${activemq.data}/amq" maxFileLength="32mb"/>

</persistenceAdapter>

 

性能高于 JDBC,写入消息时,会将消息写入日志文件,由于是顺序追加写,性能很高。

为了提升性能,创建消息主键索引,并且提供缓存机制,进一步提升性能。每个日志文件的 大小都是有限制的(默认 32m,可自行配置)。

当超过这个大小,系统会重新建立一个文件。当所有的消息都消费完成,系统会删除这 个文件或者归档。

主要的缺点是 AMQ Message 会为每一个 Destination 创建一个索引,如果使用了大量的Queue,索引文件的大小会占用很多磁盘空间。

而且由于索引巨大,一旦 Broker(ActiveMQ 应用实例)崩溃,重建索引的速度会非常 慢。

虽然 AMQ 性能略高于 Kaha DB 方式,但是由于其重建索引时间过长,而且索引文件 占用磁盘空间过大,所以已经不推荐使用。

 

3 JDBC 持久化方式

ActiveMQ 将数据持久化到数据库中。 不指定具体的数据库。 可以使用任意的数据库 中。 本环节中使用 MySQL 数据库。

下述文件为 activemq.xml 配置文件部分内容。不要完全复制。

首先定义一个 mysql-ds 的 MySQL 数据源,然后在 persistenceAdapter 节点中配置jdbcPersistenceAdapter 并且引用刚才定义的数据源。

dataSource 指定持久化数据库的 bean,createTablesOnStartup 是否在启动的时候创建数 据表,默认值是 true,

这样每次启动都会去创建数据表了,一般是第一次启动的时候设置为true,之后改成 false。

 
然后再broker标签外添加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 可以获得消息,称为 Master Broker,

其他的只能作为备份等待 Master Broker 不可用,才可能成为下一个 Master Broker。 这个表用于记录哪个 Broker 是当前的 Master Broker。

只有在消息必须保证有效,且绝对不能丢失的时候。使用 JDBC 存储策略。

如果消息可以容忍丢失,或使用集群/主备模式保证数据安全的时候,建议使用 levelDB或 Kahadb。

 

 

 

 

 

转载于:https://www.cnblogs.com/chenglc/p/10280636.html

你可能感兴趣的文章
织梦MIP文章内容页图片适配百度MIP规范
查看>>
[Kali_BT]通过低版本SerialPort蓝牙渗透功能手机
查看>>
C语言学习总结(三) 复杂类型
查看>>
HNOI2018
查看>>
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>
stm32中字节对齐问题(__align(n),__packed用法)
查看>>
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
spring-使用MyEcilpse创建demo
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>
linux下的静态库与动态库详解
查看>>
hbuilder调底层运用,多张图片上传
查看>>
较快的maven的settings.xml文件
查看>>