ActiveMQ五

持久化机制

将MQ 收到的消息存储到文件、硬盘、数据库 等、 则叫MQ 的持久化,这样即使服务器宕机,消息在本地还是有,仍就可以进行消费。

官网介绍 : http://activemq.apache.org/persistence

Activemq的高可用(持久化):
1、事务
2、持久化(自带的持久化方式 messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT))
3、签收
4、存储到文件、硬盘、数据库 等

ActiveMQ 支持的消息持久化机制: 带赋值功能的 LeavelDB 、 KahaDB 、 AMQ 、 JDBC
持久化就是高可用的机制,即使服务器宕机了,消息也不会丢失

KahaDB: 5.4 之后基于日志文件的持久化插件,默认持久化插件,提高了性能和恢复能力
KahaDB 的属性配置 : http://activemq.apache.org/kahadb
它使用一个事务日志和 索引文件来存储所有的地址
在这里插入图片描述
在这里插入图片描述
LeavelDB : 希望作为以后的存储引擎,5.8 以后引进,也是基于文件的本地数据存储形式,但是比 KahaDB 更快
它比KahaDB 更快的原因是她不使用BTree 索引,而是使用本身自带的 LeavelDB 索引

JDBC:使用jdbc数据会真实存储到数据库
使用:
1、修改activemq.xml配置

<persistenceAdapter>
      <jdbcPersistenceAdapter dataSource="#mysql-ds" crateTablesOnStartup="true"/>
 </persistenceAdapter>

注意:crateTablesOnStartup属性设置为true时ActiveMQ 启动后会自动在 mysql 的activemq 数据库下创建三张表:activemq_msgs 、activemq_acks、activemq_lock 不写默认为true,启动完成可以去掉此属性,或者更改为false
在这里插入图片描述

2、在activemq的lib目录中添加对应版本的jdbc的jar包
注意:如果使用了druid连接池或其他连接池需要添加对应的jar包

3、修改activemq.xml配置,连上自己的数据库,并创建名为activemq的数据库

<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://xxx.xxx.xxx.xxx:3306/activemq?relaxAutoCommit=true"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    <property name="poolPreparedStatements" value="true"/>
</bean>

在这里插入图片描述
4、启动activemq,此时会在数据生成三张表
activemq_msgs
在这里插入图片描述
activemq_acks
在这里插入图片描述
activemq_lock
在这里插入图片描述

queue:
点对点会在数据库的数据表 ACTIVEMQ_MSGS 中加入消息的数据,且在点对点时,消息被消费就会从数据库中删除

topic:
主题一般是先启动消费订阅然后再生产的情况下会将订阅者信息保存到ACTIVEMQ_ACKS 中,在 ACTIVEMQ_MSGS 中存储发布的消息,即使MQ 服务器下线,也会存在。

坑点:
在这里插入图片描述

JDBC增强:加入高速缓存Journal

在这里插入图片描述
同样是在activemq.xml中配置

<persistenceFactory>
	<journalPersistenceAdapterFactory 
			journalLogFiles="4"
			journalLogFileSize="32768"
			useJournal="true"
			useQuickJournal="true"
			dataSource="#mysql-ds"
			dataDirectory="activemq-data"/>
 </persistenceFactory>

在这里插入图片描述

总结:

消息持久化是指即使activemq 挂掉了消息也不会丢失

持久化机制演化过程:

从最初的AMQ Message Store方案到ActiveMQ V4版本中推出的High performance journal (高性能事务支持),并且同步推出了关于关系型数据库的存储方案, ActiveMQ 5.3版本中又推出了对KahaDB的支持(V5.4版本后称为ActiveMQ默认的持久化方案) ,后来ActiveMQ V5.8版本开始支待LevelDB,到现在, V5.9+版本提供了标准的ZookeepertLevelDB集群化方案,我们重点介绍了KahaDB. LevelDB和lmysql数据库这三种持久化存储方案。

ActiveMQ的消息持久化机制有:

AMQ:基于日志文件
KahaDB: 基于日志文件,从ActiveMQ 5.4开始默认的持久化插件
JDBC:基于第3方数据库
LevelDB: 基于文件的本地数据库储存,从ActiveMQ 5.8版本之后又推出了LevelDB的持久化引擎性能高于KahaDB
Replicated LevelDB Store: 从ActiveMQ 5.9提供了基于LevelDB和Zookeeper的数据复制方式,用于Master-slave方式的首选数据复制方案。

无论使用哪种持久化方式,消息的存储逻辑都是一致的:

就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等,然后试图将消息发送给接收者,及送成功则将消息从存储中删除失败则继续尝试。消息中心启动以后首先要检查指定的存储位置,如果有未发送成功的消息,则需要把消息发送出去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值