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

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.mzph.cn/news/131973.shtml

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

相关文章

【操作系统】进程调度

调度的概念 确定某种规则决定处理任务的顺序。 调度的三个层次&#xff1a; 高级调度&#xff08;作业调度&#xff09; 作业&#xff1a;一个具体的任务&#xff08;存放在外存的程序&#xff0c;进入内存就成了进程&#xff09; 按一定的原则从外存的作业队列中挑选一个作业…

SurfaceFlinger的硬件Vsync深入分析-千里马android framework车机手机系统开发

背景&#xff1a; 学过或者你看过surfaceflinger相关文章同学都知道&#xff0c;vsync其实都是由surfaceflinger软件层面进行模拟的&#xff0c;但是软件模拟有可能会有误差或偏差&#xff0c;这个时候就需要有个硬件vsync帮忙校准。 故才会在surfaceflinger的systrace出现如下…

C语言从入门到精通之【第一个程序hello world】

编程步骤 通常&#xff0c;我们按照以下步骤进行 确立目标设计程序编写代码编译程序运行程序测试&调试修改维护 输出hello world 每个学编程的人都会从最经典的【输出hello world】开始。 https://lightly.teamcode.com/ 我们可以使用这个在线IDE学习C语言。 代码很简…

Go语言与Python语言的性能比较

目录 一、背景与意义 二、执行速度 三、内存消耗 四、并发性能 五、编译速度与开发效率 六、综合考虑 七、应用场景 八、未来发展趋势 总结 一、背景与意义 在编程世界中&#xff0c;Go语言和Python语言都占有一席之地。Go语言是由Google开发的&#xff0c;其设计初衷…

接口框架第二篇—unittest/pytest 有什么区别

1.用例编写方法 unittest 1&#xff09;测试文件必须导入unittest包 2&#xff09;测试类必须继承unittest.TestCase 3&#xff09;测试类必须有unittest.main()方法 4&#xff09;测试方法必须要以test_打头 pytest 1&#xff09;测试文件名要以test_打头&#xff0c;或…

C#WPF嵌套布局实例

本文演示C#WPF嵌套布局实例。演示了不同布局的简单用法,便于快速应用和掌握。 <Windowx:Class="LayoutDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/x…

【机器学习】XGB/LGBM

XGBoost的decision tree用的是pre-sorted based的算法&#xff0c;也就是在tree building之前对各维特征先排序&#xff0c;代表性的算法是SLIQ和SPRINT。SLIQ和SPRINT算法的特点决定了树生长的方式是level-wise(breadth-first)的。 而LightGBM的decision tree是histogram bas…

【JavaEE】JVM 剖析

JVM 1. JVM 的内存划分2. JVM 类加载机制2.1 类加载的大致流程2.2 双亲委派模型2.3 类加载的时机 3. 垃圾回收机制3.1 为什么会存在垃圾回收机制?3.2 垃圾回收, 到底实在做什么?3.3 垃圾回收的两步骤第一步: 判断对象是否是"垃圾"第二步: 如何回收垃圾 1. JVM 的内…

Python爬虫技术系列-04Selenium库的使用

Python爬虫技术系列-04Selenium库的使用 1 Selenium库基本使用1.1 Selenium库安装1.2 Selenium库介绍 2 Selenium库的使用2.1 各个版本的区别2.1.1 Selenium IDE介绍与使用2.1.2 Selenium Grid介绍与使用2.1.3 Selenium RC介绍与使用2.1.4 WebDriver介绍与使用 2.2 WebDriver常…

Gopro hero5运动相机格式化后恢复案例

Gopro运动相机以稳定著称&#xff0c;旗下的Hero系列销售全球。下面我们来看一个Hero5格式化后拍了少量素材的恢复案例。 故障存储:64G MicroSD卡 Exfat文件系统 故障现象: 64G的卡没备份数据时做了格式化操作又拍了一条&#xff0c;发现数据没有备份&#xff0c;客户自行使…

Python教程---Python基础语法

1.程序中的几个基本概念 (1).表达式 表达式就是一个类似于数学公式的东西 比如&#xff1a;10 5 8 - 4 表达式一般仅仅用了计算一些结果&#xff0c;不会对程序产生实质性的影响 如果在交互模式中输入一个表达式&#xff0c;解释器会自动将表达式的结果输出 (2).语句 在程序…

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的版本有要求…

P1144 最短路计数 题解

文章目录 题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示完整代码 题目描述 给出一个 N N N 个顶点 M M M 条边的无向无权图&#xff0c;顶点编号为 1 ∼ N 1\sim N 1∼N。问从顶点 1 1 1 开始&#xff0c;到其他每个点的最短路有几条。 输入格式 第一行…

Websocket @ServerEndpoint不能注入@Autowired

在websocket中使用ServerEndpoint无法注入Autowired、Value 问题分析 Spring管理采用单例模式&#xff08;singleton&#xff09;&#xff0c;而 WebSocket 是多对象的&#xff0c;即每个客户端对应后台的一个 WebSocket 对象&#xff0c;也可以理解成 new 了一个 WebSocket&…

SOEM源码解析——ecx_detect_slaves(初始化从站、检测从站数量)

0 工具准备 1.SOEM-master-1.4.0源码1 ecx_detect_slaves函数总览 /*** @brief 检测从站数量* * @param context 句柄* @return int 从站数量*/ int ecx_detect_slaves(ecx_contextt *context) {uint8 b;uint16 w;int wkc;/* make special pre-init register writes to e…

学习视频剪辑:批量添加srt字幕,让视频更生动

随着社交媒体的普及&#xff0c;视频制作变得越来越重要。无论是记录生活&#xff0c;还是分享知识&#xff0c;视频都是一个非常有力的工具。但是&#xff0c;如何让您的视频更生动、更吸引人呢&#xff1f;通过学习视频剪辑&#xff0c;您可以使您的视频更具有吸引力。而在这…

vtk粗配准及其变换

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码目的&#xff1a;学习与总结 demo解决问题&#xff1a;基于标记点&#xff0c;两个点集在配准后的平均距离最小&#xff0c;要求输入两个点数必须相等&…

【Redis 速通】Redis 在 Linux 上的单机服务快速搭建与部署(附完整流程步骤及命令代码)

Redis 单机版安装与部署 Written By: Xinyao Tian 概述 本文档主要描述了 Redis 的生产环境安装及配置方法。 主要步骤 编译及安装 进入 root 用户并上传 Redis 源码安装包 查看 Redis 源码安装包的上传情况: [rootcentos-host redis]# pwd /opt/redis [root centos-ho…

2023.11.6-分析 Gateway 和 VirtualService

2023.11.6-分析 Gateway 和 VirtualService 目录 本节实战 实战名称 正文 前面我们创建了一个 Gateway 和 VirtualService 对象&#xff0c;用来对外暴露应用&#xff0c;然后我们就可以通过 ingressgateway 来访问 Bookinfo 应用了。那么这两个资源对象是如何实现的呢&…

【0基础学Java第七课】-- 类和对象01

7. 类和对象 7.1 面向对象的初步认知7.1.1 什么是面向对象7.1.2 面向对象与面向过程 7.2 类定义和使用7.2.1 简单认识类7.2.2 类的定义格式7.2.3 定义一个狗类7.2.4 定义一个学生类 7.3 类的实例化7.3.1 什么是实列化7.3.2 引用只能指向对象&#xff0c;且不能同时指向多个对象…