ActiveMq学习⑧__ActiveMQ的消息持久化机制

news2024/11/27 20:29:49

ActiveMQ的消息存储和持久化

  • MQ的高可用
    • 事务
    • 持久
    • 签收
    • 可持久化 (类似于与mq消息的同步机制)

为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一半都会采用持久化机制

ActiveMQ的消息持久化机制

  • ActiveMQ的消息持久化机制有
    • JDBC
    • AMQ
    • KahaDB
    • LevelDB
    • 无论使用哪种持久化方式,消息的存储逻辑都是一致的。
  • 逻辑
    • 就是在发送者将消息发送出去后
    • 消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等。
    • 再试图将消息发给接收者
    • 成功则将消息从存储中删除,失败则继续尝试尝试发送。

消息中心启动以后,要先检查指定的存储位置是否有未成功发送的消息,如果有,则会先把存储位置中的消息发出去。

官网
在这里插入图片描述

ActiveMQ的消息持久化机制有哪些?

  • AMQ Message Store

    • 基于文件的存储方式,是以前的默认消息存储,现在不用了。
    • 具有写入速度快和容易恢复的特点
    • 消息存储在一个个文件中,文件默认大小为32M,当一个存储文件中的消息已经全部被消费,那么这个文件将被标识为可删除,在下一个清楚阶段买这个文件可删除
    • AMQ适用于ActiveMQ5.3之前的版本
  • KahaDB (默认)

    • 基于日志文件,从ActiveMQ5.4开始默认的持久化插件,我们从配置文件 activemq.xml 中可以看到
      在这里插入图片描述
    • KahaDB是一个基于文件的持久性数据库,它是使用它的消息代理的本地数据库。
      在这里插入图片描述
      • db-.log 为 kahaDB 存储消息的数据记录文件,文件大小限定32M,大于32M就会递增下一个数据文件,比如:log-2.log、log-3.log 以此类推。当不再引用数据文件中的任何消息时,文件就会被删除或归档。
      • db.data 文件包含了持久化的 BTree 索引,是消息的索引文件,本质上是 B-Tree 树,使用 B-Tree 作为索引指向 db-.log 里面存储的消息。
        在这里插入图片描述
      • db.free 记录 db.data 文件中哪些页面是空闲的,后面建索引则优先从空闲页中创建。文件的具体内容是所有空闲页的ID
      • db.redo 用来进行消息恢复,如果KahaDB消息存储在强制退出后启动,用于恢复BTree索引
      • lock 文件为文件锁,表示当前获得 kahaDB 读写权限的 broker
    • 它已经针对快速持久性进行了优化。
    • 它是自ActiveMQ 5.4以来的默认存储机制。
    • KahaDB比其前身AMQ消息存储使用更少的文件描述符,并提供更快的恢复
  • LevelDB消息存储

    • 从 ActiveMQ 5.8 之后引进的,和 KahaDB 非常相似
    • 基于文件的本地数据存储形式,但是它提供比 KahaDB 更快的持久性。
    • 虽然还不是默认的消息存储,但我们希望此存储实现在未来的版本中成为默认的。
    • 但它不适用自定义 B-Tree 实现来索引预写日志,而是使用基于 LevelDB 的索引。要使用 LevelDB 需要修改配置文件为:
<persistenceAdapter>
    <levelDB directory="activemq-data"/>
</persistenceAdapter>
  • JDBC消息存储

    • 原理图
      在这里插入图片描述

    • 添加mysql数据库的驱动包到lib文件夹
      在这里插入图片描述

    • jdbcPersistenceAdapter配置
      在这里插入图片描述

    • 数据库连接池配置
      在这里插入图片描述

    • 建仓sql和建表说明
      在这里插入图片描述

      • ACTIVEMQ_MSGS
        queue和topic都存储在里面
        在这里插入图片描述
      • ACTIVEMQ_ACKS
        存储持久订阅的信息和最后一个持久订阅接收的消息ID
        在这里插入图片描述
      • ACTIVEMQ_LOCK
        表ACTIVEMQ_LOCK在集群环境下才有用,只有一个Broker可以获取消息,称为Master Broker,其他的只能作为备份等待Master Broker不可用,才可能成为下一个Master Broker。这个表用于记录哪个Broker是当前的Master Broker
        在这里插入图片描述
    • 验证和数据表变化

      • 下面我先以 queue 为例,想要消息保存到数据库生效,必须在创建消息生产者的时候开启持久化模式(消费者无需改写代码):
        这样,当生产者发送消息成功后就可以在数据库中的 activemq_msgs 表看到相应的数据了。而当消费者消费消息之后,数据库的相应记录就会被删除。
        在这里插入图片描述
      • 点到点(queue)
        1. 在点对点类型中
        2. 当DeliveryMode设置为NON_PERSISTENCE时,消息被保存在内存中
        3. 当DeliveryMode设置为PERSISTENCE时,消息保存在broker的相应的文件或者数据库中。
        4. 而且点对点类型中消息一旦被Consumer消费,就从数据中删除
      • 发布/订阅(topic)
        1. 设置了持久订阅数据库里面会保存订阅者的信息
        2. 我们先启动一下持久化topic 的消费者。看到ACTIVEMQ_ACKS 数据表多了一条消息。LAST_ACKED_ID记录了CLIENT_ID最后签收的一条消息.
          在这里插入图片描述
        3. 我们启动持久化生产6条数据,ACTIVE_MSGS数据表新增6条数据,消费者消费所有的数据后,表里的数据并没有消失。持久化的topic的消息不管是否被消费,是否有消费者,产生的数据永远存在且只存储一条。需要注意,持久化topic数据量太大会导致性能下降。
          在这里插入图片描述
          在这里插入图片描述
  • JDBC Message store with ActiveMQ Journal

    • 这种方式克服了 JDBC 存储的不足:JDBC 每次消息过来,都要去读写数据库,比较消耗性能,所以引进了 ActiveMQ Journal,使用高速缓存写入技术,大大提高了性能
    • 要使用 ActiveMQ Journa 的话,需要修改配置文件,把持久化工厂修改为如下
      在这里插入图片描述
    • 当消费者的速度能够及时跟上生产者消息的生产速度时,journal文件能够大大减少需要写入到DB中的消息。
      举个例子:生产者生产了1000条消息,这1000条消息会保存到journal文件,如果消费者的消费速度很快的情况下,在journal文件还没有同步到DB之前,消费者已经消费了90%的以上消息,那么这个时候只需要同步剩余的10%的消息到DB。如果消费者的速度很慢,这个时候journal文件可以使消息以批量方式写到DB。
    • 总结: 以前是实时写入mysql,在使用了journal后,数据会被journal处理,如果在一定时间内journal处理(消费)完了,就不写入mysql,如果没消费完,就写入mysql,起到一个缓存的作用。在慢慢的同步数据库
  • 持久化总结
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1175267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

canvas实现刮奖功能

canvas刮奖原理很简单&#xff0c;就是在刮奖区添加两个canvas&#xff0c;第一个canvas用于显示刮开后显示的内容&#xff0c;可以是一张图片或一个字符串&#xff0c;第二个canvas用于显示涂层&#xff0c;可以用一张图片或用纯色填充&#xff0c;第二个canvas覆盖在第一个ca…

逆向学习记录(5)刷机

首要前提&#xff1a;手机刷机必须OEM解锁&#xff08;BL解锁&#xff09;&#xff0c;否则不能刷机&#xff01; 1、根据手机机型下载手机系统包&#xff0c;首次登陆网址需要同意协议。然后在右侧选机型&#xff0c;中间就出来各种适合本机型的系统。 下载网址 https://dev…

47基于matlab的水印提取,将水印和载体进行图像融合

基于matlab的水印提取&#xff0c;将水印和载体进行图像融合&#xff0c;成为一体&#xff0c;可对合成图像进行加噪处理&#xff0c;剪切处理&#xff0c;小波压缩处理&#xff0c;旋转处理等操作&#xff0c;最后对合成图像实现水印提取&#xff0c;程序已调通&#xff0c;可…

【AI好好玩02】利用Lama Cleaner本地实现AIGC试玩:擦除对象、替换对象、更换风格等等

目录 一、安装二、擦除功能1. LaMa模型实操实例一&#xff1a;去除路人实操实例二&#xff1a;去水印实操实例三&#xff1a;老照片修复 2. LDM模型3. ZITS模型4. MAT模型5. FcF模型6. Manga模型 三、替换对象功能1. sd1.52. sd23. anything44. realisticVision1.45. 四个模型的…

Tomcat安装配置教程

目录 1、安装tomcat1.1、查看JDK版本1.2、 匹配对应的JDK版本1.3、 下载Tomcat1.3.1、 安装包版&#xff08;推荐&#xff0c;不用配环境&#xff09;1.3.2、 压缩包版 2、 运行Tomcat3、 不能运行问题 1、安装tomcat 1.1、查看JDK版本 由于不同版本tomcat对于jdk的版本有要求…

Mac 下安装golang环境

一、下载安装包 安装包下载地址 下载完成&#xff0c;直接继续----->下一步到结束即可安装成功&#xff1b; 安装成功之后&#xff0c;验证一下&#xff1b; go version二、配置环境变量 终端输入vim ~/.zshrc进入配置文件&#xff0c;输入i进行编辑 打开的不管是空文本…

redis教程 二 redis客户端Jedis使用

文章目录 Redis的Java客户端-JedisJedis快速入门创建工程&#xff1a;引入依赖&#xff1a;建立连接测试&#xff1a;释放资源Jedis连接池创建Jedis的连接池改造原始代码 Redis的Java客户端-SpringDataRedis快速入门导入pom坐标配置文件测试代码 数据序列化器StringRedisTempla…

“第六十一天”

这三个也算一类的&#xff0c;减和加的处理差不多&#xff0c;不过这个题多了限制是被减数大于减数&#xff0c;要是想再完整一点&#xff0c;可以把小于的情况也考虑进去&#xff0c;不过这个我是如果被减数小于减数的话&#xff0c;我就用减数加被减数&#xff0c;然后最后打…

JVM 各个参数详解

在一些规模稍大的应用中&#xff0c;Java虚拟机&#xff08;JVM&#xff09;的内存设置尤为重要&#xff0c;想在项目中取得好的效率&#xff0c;GC&#xff08;垃圾回收&#xff09;的设置是第一步。 PermGen space&#xff1a;全称是Permanent Generation space.就是说是永久…

ActiveMq学习⑤__ActiveMq的Broker

ActiveMq的Broker 是什么&#xff1f; 相当于一个ActiveMq的服务器实例 Broker其实就是实现了用代码的形式启动ActiveMQ将MQ嵌入到Java 代码中&#xff0c;以便随时用随时启动&#xff0c;在用的时候再去启动这样节省了资源&#xff0c;也保证了可靠性。 按照不同的配置文件…

线程的创建、等待、退出

多线程开发在Linux平台上已经有成熟的pthread库支持&#xff0c;所以使用pthread库在编译时要加上-pthread。其设计的多线程开发的基本概念主要包含3点&#xff1a;线程、互斥锁、条件。其中线程操作又分线程的创建、退出、等待三种。互斥锁包含4种操作&#xff0c;分别是创建、…

线程同步——互斥量解锁、解锁

类似与进程间通信信号量的加锁解锁。 对互斥量进行加锁后&#xff0c;任何其他试图在此对互斥量加锁的线程都会被阻塞&#xff0c;直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程被阻塞&#xff0c;所有在该互斥锁上的阻塞线程都会变成可运行状态&#xff0c;第一个变…

《算计》

第一章&#xff1a;机器的诞生 在一个科技高度发达的未来世界&#xff0c;人类社会已经进入了自主机器时代。人们创造出了一种名为“超级自主机器&#xff08;Super Autonomous Machine&#xff0c;简称SAM&#xff09;”的全新型机器&#xff0c;它拥有无限的智慧和学习能力&a…

LeetCode.6 N字形变换

一开始想的是真的创建一个数组 去按照题目所给的要求填入数据 最后输出不为空的数组项 但是不仅时间复杂度高 而且错误频繁出现 最终也没有提交成功 查阅题解后发现数组并不重要 假设我们忽略掉数组中的那些空白项 最终输出的结果就是numRows行的字符串的拼接 string conver…

基于Matlab的yolo算法行人检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 # 基于Matlab编写的Yolo算法行人检测系统介绍 基于Matlab编写的Yolo算法行人检测系统是一种用于自动检测图像或视频…

SAP中接口与集成

从进化的角度看SAP中接口和集成的十个概念 - 知乎 SAP比较常用的几个接口方式及比较-SAP技术站 1. 文件接口 基于文件交换的接口是从SAP向第三方系统提供数据的最古老的技术之一。将文本或excel文件推送到特定目录或从应用程序服务器中提取&#xff1b;两种方式都有效。在没有…

[云原生2. ] Kubernetes的简单介绍

文章目录 1. Kubernetes 概述1.1 简介1.2 作用1.3 Kubernetes 的特点1.4 Kubernetes 主要功能 2. Kubernetes 集群架构与组件2.1 Master 组件2.1.1 Kube-apiserver2.1.2 Kube-controller-manager2.1.3 Kube-scheduler 2.2 配置存储中心2.2.1 etcd 2.3. Node 组件2.3.1 Kubelet2…

51单片机-定时计数器

文章目录 前言1 原理2.编程 前言 1 原理 2.编程 定时计算&#xff1a; 50ms501000us 一个机器周期&#xff1a;1.085us 65535 - 501000/1.08546082 故 40082*1.08549998.97 /*定时器1&#xff0c;定时模式 工作模式1 16位计数器&#xff0c; 定时20秒后使能蜂鸣器*/ #include…

MP4视频文件损坏怎么修复?

3-2 作为摄影师&#xff0c;或者在平时有拍摄工作的事情的&#xff0c;比如搞婚庆、搞航拍什么的&#xff0c;有一定的概率会遇到损坏的视频文件&#xff0c;比如相机突然断电、无人机炸机等&#xff0c;有可能会导致保存的MP4文件损坏。 这种文件使用播放器播放的话&#xf…

2023数学建模国赛C题赛后总结

今天国赛的成绩终于出来了&#xff0c;盼星星盼月亮的。之前面试的时候已经把我给推到国奖评委那里去了&#xff0c;可是好可惜&#xff0c;最终以很微小的劣势错失国二。只拿到了广西区的省一。我心里还是很遗憾的&#xff0c;我真的为此准备了很久&#xff0c;虽然当中也有着…