当前位置: 首页 > news >正文

ActiveMQ 的消息持久化策略

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。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • K8s Calico替换为Cilium,以及安装Cilium过程
  • 解决Vue 3中Element Plus el-color-picker 组件消失的问题
  • 828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
  • 浅显易懂的Git教程
  • 4.《DevOps》系列K8S部署CICD流水线之Helm部署Harbor私人镜像仓库
  • 阿里巴巴新推出Java版AI 应用开发框架-Spring AI Alibaba
  • 用Flowise+OneAPI+Ollama做一个在线翻译工作流
  • LLaMA-Factory 使用 alpaca 格式的数据集
  • Linux 常用命令 - more 【分页显示文件内容】
  • react + antDesign封装图片预览组件(支持多张图片)
  • 全面掌握大模型:从零基础到精通的终极指南,超详细教程手把手教会你,收藏我这一篇就够了
  • Java笔试面试题AI答之设计模式(5)
  • python gensim实现作者主题模型(Author-Topic Model)
  • 车路云一体化大模型数据治理方案
  • 什么是RTOS操作系统
  • php的引用
  • @jsonView过滤属性
  • 【Amaple教程】5. 插件
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Docker容器管理
  • Git 使用集
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java第三方包学习之lombok
  • js操作时间(持续更新)
  • leetcode388. Longest Absolute File Path
  • log4j2输出到kafka
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Nacos系列:Nacos的Java SDK使用
  • php中curl和soap方式请求服务超时问题
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Spring Cloud中负载均衡器概览
  • Theano - 导数
  • Web Storage相关
  • Windows Containers 大冒险: 容器网络
  • 测试开发系类之接口自动化测试
  • 小程序开发中的那些坑
  • 怎么将电脑中的声音录制成WAV格式
  • ionic异常记录
  • Mac 上flink的安装与启动
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #162 (Div. 2)
  • (+4)2.2UML建模图
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (汇总)os模块以及shutil模块对文件的操作
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (四)事件系统
  • (五)关系数据库标准语言SQL
  • (已解决)什么是vue导航守卫
  • .naturalWidth 和naturalHeight属性,
  • .NET 设计一套高性能的弱事件机制