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.rhkb.cn/news/181720.html

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

相关文章

UE5——源码阅读——3——引擎退出

这边主要是做了个标记&#xff0c;为了UE的性能分析 把全局运行设置为0&#xff0c;把日志也设置为空 判断预加载屏幕 关闭visual logger 关闭资源编译的管理器 引擎预退出 预退出的核心代理 关闭网络追踪 关闭所有电影场景的捕捉接口 关闭UE中用于MID的缓存 关闭引擎…

【Spring Security】Spring Security 认证与授权

在前面的章节中,我们沿用了Spring Security默认的安全机制:仅有一个用户,仅有一种角色。在实际开发中,这自然是无法满足需求的。本章将更加深入地对Spring Security迚行配置,且初步使用授权机制。 3.1 默认数据库模型的认证与授权 3.1.1、资源准备 首先,在controller包…

Java8实战-总结46

Java8实战-总结46 CompletableFuture&#xff1a;组合式异步编程让代码免受阻塞之苦使用 CompletableFuture 发起异步请求寻找更好的方案 CompletableFuture&#xff1a;组合式异步编程 让代码免受阻塞之苦 使用 CompletableFuture 发起异步请求 可以使用工厂方法supplyAsyn…

51单片机汇编-点亮一个led

文章目录 前言1.打开IDE2.设置编辑器3.设置输出4. 原理图5.编写代码6 编译7.下载8.其它代码1.LED闪烁2.跑马灯 前言 51单片机基础 本章主要介绍打开一个led,具体采用51汇编 1.打开IDE 选择STC89C52RC 后缀是.asm 2.设置编辑器 3.设置输出 4. 原理图 5.编写代码 ORG 00H;伪代…

Webpack的Tree Shaking。它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Web前端—网页制作(以“学成在线”为例)

版本说明 当前版本号[20231105]。 版本修改说明20231105初版 目录 文章目录 版本说明目录day07-学成在线01-项目目录02-版心居中03-布局思路04-header区域-整体布局HTML结构CSS样式 05-header区域-logo06-header区域-导航HTML结构CSS样式 07-header区域-搜索布局HTML结构CSS…

MongoDB设置密码

关于为什么要设置密码 公司的测试服务器MongoDB服务对外网开放的&#xff0c;结果这几天发现数据库被每天晚上被人清空的了&#xff0c;还新建了个数据库&#xff0c;说是要支付比特币。查了日志看到有个境外的IP登录且删除了所有的集合。所以为了安全起见&#xff0c;我们给m…

企业级SpringBoot单体项目模板 —— 使用 AOP + JWT实现登陆鉴权

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot、企业级、项目模板☀️每日 一言&#xff1a;没学会走就学跑从来都不是问题&#xff0c;要问问自己是不是天才&#xff0c;如果不是&#xff0c;那就要一步步来 文章目录 使用JWT实现…

python用cv2画图(line, rectangle, text等)

Python做图像图形研究的时候&#xff0c;通常需要画很多辅助几何形状&#xff08;比如bounding box等&#xff09;。基于opencv的几何图形绘制具有易用性&#xff0c;而且天然能和numpy数组交互。 本文总结了几种常用的cv2画几何图形的方法&#xff0c;当一个简易的手册使用&a…

飞书开发学习笔记(三)-利用python开发调试云文档和电子表格

飞书开发学习笔记(三)-利用python开发调试云文档和电子表格 一.建立Python飞书开发环境 首先还是进入开放平台下的API调试台 飞书开放平台&#xff1a;https://open.feishu.cn/app?langzh-CN 以获取"我的空间"下的文件清单为例&#xff0c;通过获取飞书API调试台提…

canvas实现刮奖功能

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

【JMeter】后置处理器的分类以及场景介绍

1.常用后置处理器的分类 Json提取器 针对响应体的返回结果是json格式的会自动生成新的变量名为【提取器中变量名_MatchNr】,取到的个数由jsonpath expression取到的个数决定 可以当作普通变量调用,调用语法:${提取器中变量名_MatchNr}正则表达式提取器 返回结果是任何数据格…

win10 + cmake3.17 编译 giflib5.2.1

所有源文件已经打包上传csdn&#xff0c;大家可自行下载。 1. 下载giflib5.2.1&#xff0c;解压。 下载地址&#xff1a;GIFLIB - Browse Files at SourceForge.net 2. 下载CMakeLists.txt 及其他依赖的文件 从github上的osg-3rdparty-cmake项目&#xff1a; https://github.…

第五部分:Tomcat

5.1&#xff1a;JavaWeb 5.1.1&#xff1a;JavaWeb的概念 ①什么是JavaWeb? JavaWeb是指所有通过Java语言编写可以通过浏览器访问的程序的总称 JavaWeb是基于请求和响应来开发的 ②什么是请求&#xff1f; 请求是指客户端给服务器发送数据&#xff0c;叫请求Request ③什么是…

谁说 Linux 不能玩游戏?

在上个世纪最早推出视频游戏的例子是托马斯戈德史密斯&#xff08;Thomas T. Goldsmith Jr.&#xff09;于1947年开发的“「Cathode Ray Tube Amusement Device」”&#xff0c;它已经显着发展&#xff0c;并且已成为人类生活中必不可少的一部分。 通过美国游戏行业的统计数据&…

String的几个常见面试题及其解析

String s3 new String("a") new String("b")会不会在常量池中创建对象&#xff1f; 答案&#xff1a;不会&#xff0c;首先需要解释“”字符串拼接的理解。 采用 运算符拼接字符串时&#xff1a; 如果拼接的都是字符串直接量&#xff0c;则在编译时编…

【软件逆向】如何逆向Unity3D+il2cpp开发的安卓app【IDA Pro+il2CppDumper+DnSpy+AndroidKiller】

教程背景 课程作业要求使用反编译技术&#xff0c;在游戏中实现无碰撞。正常情况下碰撞后角色死亡&#xff0c;修改为直接穿过物体不死亡。 需要准备的软件 il2CppDumper。DnSpy。IDA Pro。AndroidKiller。 一、使用il2CppDumper导出程序集 将{my_game}.apk后缀修改为{my_…

rabbitmq的confirm模式获取correlationData为null解决办法

回调函数confirm中的correlationDatanull // 实现confirm回调,发送到和没发送到exchange,都触发 Override public void confirm(CorrelationData correlationData, boolean ack, String cause) {// 参数说明:// correlationData: 相关数据,可以在发送消息时,进行设置该参数// …

Go 方法介绍,理解“方法”的本质

Go 方法介绍&#xff0c;理解“方法”的本质 文章目录 Go 方法介绍&#xff0c;理解“方法”的本质一、认识 Go 方法1.1 基本介绍1.2 声明1.2.1 引入1.2.2 一般声明形式1.2.3 receiver 参数作用域1.2.4 receiver 参数的基类型约束1.2.5 方法声明的位置约束1.2.6 如何使用方法 二…

【网络协议】聊聊CND如何进行提升系统读性能

我们知道对于京东这种仓储来说&#xff0c;其实并不是在北京有一个仓储中心&#xff0c;而是针对全国主要的地方&#xff0c;北京、上海、广州、杭州&#xff0c;郑州等地方都有自己的仓储中心&#xff0c;当用户下单后&#xff0c;就会根据最近的仓储进行发货&#xff0c;不仅…