ActiveMQ 的消息持久化策略

news2024/9/23 10:24:15
ActiveMQ 的消息持久化策略

消息持久化对于可靠消息传递来说是一种比较好的方法,即使发送者和接受者不是同时在线,或者消息中心在发送者发送消息后宕机了,消息中心重启后仍然可以将消息发送出去。

消息持久性的原理很简单,就是在发送消息出去后,消息中心首先将消息存储在本地文件、内存或者远程数据库,然后把消息发送给接受者,发送成功后再把消息从存储中删除,失败则继续尝试。

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

ActiveMQ 的消息持久化机制有 KahaDB,AMQ,JDBC 和 LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的。为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制。

1、JDBC持久化方式

使用 JDBC 持久化方式,数据库会创建3个表:activemq_msgs,activemq_acks 和 activemq_lock。activemq_msgs 用于存储消息,Queue和Topic都存储在这个表 activemq_acks 用于存储订阅关系,如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存 activemq_lock 用于做集群的时候,实现master选举的表,这个表用于记录哪个 Broker 是当前的 Master Broker

配置方式

1、修改安装目录下conf/acticvemq.xml文件,首先定义一个 mysql-ds 的 MySQL 数据源

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

2、然后在 broker 节点下的 persistenceAdapter 节点中配置 jdbcPersistenceAdapter 并且引用刚才定义的数据源

<persistenceAdapter> 
    <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false" /> 
</persistenceAdapter>

dataSource 指定持久化数据库的bean,createTablesOnStartup 表示是否在启动的时候创建数据表,默认值是true,这样每次启动都会去创建数据表了,因此第一次启动的时候设置为 true,之后改成 false。

3、添加 Jar 包依赖,拷贝到安装目录下的 lib 文件夹下:

036f4a5f4592b0721d37a5b051bef108.png

JDBC持久化方式一般不使用,了解即可。

2、AMQ 方式

AMQ 基于文件的存储方式,写入速度很快,容易恢复。性能高于 JDBC,写入消息时,会将消息写入日志文件。

为了提升性能,创建消息主键索引,并且提供缓存机制,进一步提升性能。每个日志文件的大小都是有限制的(默认32M,可自行配置)。当超过这个大小,系统会重新建立一个文件。当所有的消息都消费完成,系统会删除这个文件或者归档(取决于配置)。

主要的缺点是 AMQ Message 会为每一个 Destination 创建一个索引,如果使用了大量的 Queue,索引文件的大小会占用很多磁盘空间。而且由于索引巨大,一旦Broker崩溃,重建索引的速度会非常慢。

配置如下

<persistenceAdapter>
     <amqPersistenceAdapter directory="${activemq.data}/activemq-data" maxFileLength="32mb"/>
</persistenceAdapter>
3、KahaDB 方式

KahaDB 是从 ActiveMQ 5.4 开始默认的持久化插件,也是项目中默认的持久化存储方式,可用于任何场景,提高了性能和恢复能力。KahaDb 恢复时间远远小于其前身AMQ并且使用更少的数据文件,所以可以完全代替AMQ。

kahaDB 的持久化机制同样是基于日志文件,索引和缓存。消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址。

KahaDB 是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化,在 KahaDB 中,数据被追加到 data logs中。当不再需要log文件中的数据的时候,log文件会被丢弃。

KahaDB的配置方式

<persistenceAdapter>
    <kahaDB directory="${activemq.data}/activemq-data" />
</persistenceAdapter>

KahaDB的存储原理

在安装目录下的 data/kahadb 这个目录下,会生成四个文件db.data 它是消息的索引文件,本质上是 B-Tree(B树),使用 B-Tree 作为索引指向 db-.log 里面存储的消息;db.redo 用来进行消息恢复;db-.log 存储消息内容。新的数据以 APPEND 的方式追加到日志文件末尾。属于顺序写入,因此消息存储是比较快的。默认是32M,达到阀值会自动递增;lock 文件锁,表示当前获得 kahadb 读写权限的 broker;

4、基于内存的消息存储

基于内存的消息存储,主要是存储所有的持久化的消息到内存中。persistent=”false”,表示不设置持久化存储,直接存储到内存中。

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" persistent="false">

ActiveMQ 的消息持久化策略,推荐使用 KahaDB。

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

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

相关文章

[Linux] 通透讲解 什么是进程

标题&#xff1a;[Linux] 通透讲解 什么是进程 个人主页&#xff1a;水墨不写bug &#xff08;图片来自网络&#xff09; 目录 一.深入进程基本概念 二.管理好进程 1.管理好进程的方法 2.描述进程-PCB 3.组织进程 正文开始&#xff1a; 本文按照对进程的先描述再组织进行…

C++之模版的进阶

1.非类型模版参数 模版参数分类类型与非类型形形参 类型形参&#xff1a;出现在模版参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff1a;用一个常亮作为类&#xff08;函数&#xff09;模版的一个参数&#xff0c;在类&#xff08;函数…

股指期货交割方式是什么?

说起股指期货&#xff0c;这可是个高大上的金融玩意儿。咱们平时买卖股票&#xff0c;那是看准了哪只股就下手&#xff0c;赚了就卖&#xff0c;赔了就扛&#xff0c;挺直接的。但股指期货呢&#xff0c;它玩的是未来的预期&#xff0c;就像是你跟人打赌明天天气好不好&#xf…

Fyne ( go跨平台GUI )中文文档-Fyne总览(二)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2​​​​​​​ 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne…

《python语言程序设计》2018版第8章18题几何circle2D类(中部)

第一、重新分析 第一-1、我设计的第一模式第一-1-1、遇到的逻辑分析迷雾第一-1-2、无畏挣扎后的无奈 第二-1、我就把你们两个放到一起,第二-2、我的想法 当我看到了这个2个园并且比对. 第一-1、我设计的第一模式 设计一个最抽象的Circle2D类. 这个类只包含一个x,y和circle 这个…

Parallels Desktop 20 for Mac 推出:完美兼容 macOS Sequoia 与 Win11 24H2

Parallels Desktop 20 for Mac 近日正式发布&#xff0c;这一新版本不仅全面支持 macOS Sequoia 和 Windows 11 24H2&#xff0c;还在企业版中引入了一个全新的管理门户。新版本针对 Windows、macOS 和 Linux 虚拟机进行了多项改进&#xff0c;其中最引人注目的当属 Parallels …

让模型评估模型:构建双代理RAG评估系统的步骤解析

在当前大语言模型(LLM)应用开发的背景下,一个关键问题是如何评估模型输出的准确性。我们需要确定哪些评估指标能够有效衡量提示(prompt)的效果,以及在多大程度上需要对提示进行优化。 为解决这一问题,我们将介绍一个基于双代理的RAG(检索增强生成)评估系统。该系统使用生成代理…

免费开源的AI 智能网盘,图片和媒体管理工具 | 极空间部署『PicHome』

免费开源的AI 智能网盘&#xff0c;图片和媒体管理工具 | 极空间部署『PicHome』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 想必很多小伙伴儿手机&#xff0c;电脑&#xff0c;甚至是网盘上都存取了大量的各类图片&#xff0c;不知道大家都是怎么管理你手头大量的图片的&…

食探秘:Spring Boot校园周边美食发现平台

第三章 系统设计 3.1 系统概要设计 本校园周边美食探索及分享平台选择B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式。适合在互联网上进行操作&#xff0c;只要用户能连网&#xff0c;任何时间、任何地点都可以进行系统的操作使用。系统工作原理图如图3-1所…

PMP--二模--解题--71-80

文章目录 13.干系人管理--干系人登记册--记录干系人的身份信息、评估信息、干系人分类。识别完干系人更新干系人登记册。71、 [单选] 一名初级项目经理被指派到一个新启动的项目&#xff0c;高级项目经理指示该初级项目经理去识别在项目中享有既得利益的人员。高级项目经理让初…

上半年营收净利双降,债台高筑下扩产能,天合光能“激进”前行?

近年来&#xff0c;随着新能源产业的蓬勃兴起&#xff0c;以及消费端对低碳经济追求的日益增强&#xff0c;再叠加分布式光伏发电系统的快速发展&#xff0c;全球市场对光伏组件的需求量愈发高涨。 而我国目前又是全球最大的光伏组件生产国和出口国&#xff0c;这离不开隆基绿…

桶排序和计数排序(非比较排序算法)

桶排序 桶排序是一种基于分配的排序算法&#xff0c;特别适合用来排序均匀分布的数据。它的基本思想是将输入的数据分到有限数量的桶里&#xff0c;然后对每个桶内的数据分别进行排序&#xff0c;最后再将各个桶内的数据合并得到最终的排序结果。(通常用于浮点数&#xff0c;因…

LLM大模型训练/推理的显卡内存需求计算

无论你是从头开始训练 LLM、对其进行微调还是部署现有模型&#xff0c;选择合适的 GPU 对成本和效率都至关重要。在这篇博客中&#xff0c;我们将详细介绍使用单个和多个 GPU 以及不同的优化器和批处理大小进行 LLM 训练和推理时 GPU 要求的所有信息。 计算机处理器由多个决定…

SM2无证书及隐式证书公钥机制签名和加密过程详解(一)

前面介绍SM2无证书及隐式证书公钥机制下用户公私密钥对的Python实现&#xff08;具体参看SM2隐式证书用户公私钥生成python代码实现_sm2 python 密钥生成-CSDN博客&#xff09;&#xff0c;可以看到需由用户和KGC&#xff08;可信密钥生成中心&#xff09;共同参与才能计算得到…

小程序-基础知识1

Mustache语法 小程序和vue一样提供了插值语法 但是小程序不能调用方法{{xxxx()}} hidden属性 hidden是所有组件都默认拥有的属性&#xff0c; hidden与wx:if的区别&#xff1a; wx:if是控制组件是否渲染,hidden控制显示或隐藏是通过添加hidden属性。 wx:for 除了可以遍历…

服务器配置虚拟环境及离线安装python

本篇文章基于已经装好conda环境进行哈&#xff0c;不会安装conda可参考服务器离线安装anaconda-CSDN博客 1.打印现有虚拟环境列表 conda env list&#xff0c;可以看见我现在有base、ai、py38三个环境 2.删除指定虚拟环境 conda remove -n py38 --all&#xff0c;回车后输入ye…

LeetCode 面试经典150题 190.颠倒二进制位

复习知识&#xff1a;正数的原码、反码、补码相同&#xff0c;负数的反码在其原码的基础上, 符号位不变&#xff0c;其余各个位取反&#xff0c;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后1 (即在反码的基础上1)。 题目&#xff1a;颠倒给定的 32 位无符号…

全国及分(31个)省全社会就业人数(1978-2022年)

分省就业人数分析 经济发达省份&#xff1a;如广东、江苏、浙江等省份的就业人数较高&#xff0c;这与它们的经济发展水平和产业结构密切相关。欠发达省份&#xff1a;虽然就业人数相对较低&#xff0c;但也呈现出增长态势&#xff0c;显示了国家在区域协调发展上的成效。 从…

软考高级:数据库事务状态区分:活动、部分提交、提交、失败、中止 AI 解读

讲解 数据库事务状态的区分可以用来表示事务在不同阶段的状态。事务&#xff08;Transaction&#xff09;是数据库中的一组操作&#xff0c;要么全部成功&#xff0c;要么全部失败。这些状态可以帮助我们理解事务从开始到结束的整个生命周期。 生活化例子 假设你去餐厅点餐&…

AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…