您现在的位置是:首页 > 正文

ActiveMQ专题10 —— ActiveMQ的存储和持久化

2024-04-01 00:53:00阅读 0

官网

click to 官网

完美的诠释了持久化数据库问题在这里插入图片描述

体会一下面试

redis持久化方式有几种

AOF、RDB
同样对于activemq,也是需要了解它的持久化机制

持久化

一 句 话 就 是 : A c t i v e M Q 宕 机 了 , 消 息 不 会 丢 失 的 机 制 \color{red}一句话就是:ActiveMQ宕机了,消息不会丢失的机制 ActiveMQ
说明:为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一半都会采用持久化机制。
A c t i v e M Q 的 消 息 持 久 化 机 制 有 J D B C , A M Q , K a h a D B 和 L e v e l D B \color{red}ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB ActiveMQJDBCAMQKahaDBLevelDB
无论使用哪种持久化方式,消息的存储逻辑都是一致的。就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等。再试图将消息发给接收者,成功则将消息从存储中删除,失败则继续尝试尝试发送。消息中心启动以后,要先检查指定的存储位置是否有未成功发送的消息,如果有,则会先把存储位置中的消息发出去。
J D B C , A M Q , K a h a D B , L e v e l D B 和 J D B C M e s s a g e S t o r e w i t h A c t i v e M Q J o u r n a l 下 面 详 细 说 明 \color{red}JDBC,AMQ,KahaDB,LevelDB和JDBC Message Store with ActiveMQ Journal 下面详细说明 JDBCAMQKahaDBLevelDBJDBCMessageStorewithActiveMQJournal

详细介绍各种持久化方式

1. AMQ Message Store (了解,不需要掌握)

基 于 文 件 的 存 储 机 制 , 是 以 前 的 默 认 机 制 , 现 在 不 再 使 用 。 \color{red}基于文件的存储机制,是以前的默认机制,现在不再使用。 使
AMQ是一种文件存储形式,它具有写入速度快和容易恢复的特点。消息存储再一个个文件中文件的默认大小为32M,当一个文件中的消息已经全部被消费,那么这个文件将被标识为可删除,在下一个清除阶段,这个文件被删除。AMQ适用于ActiveMQ5.3之前的版本

一 句 话 理 解 : 5.3 之 前 默 认 时 候 A M Q , 现 在 已 经 更 新 到 15 , 老 早 被 淘 汰 了 , 不 用 管 它 , 只 需 要 记 住 这 个 名 词 即 可 \color{red}一句话理解:5.3之前默认时候AMQ,现在已经更新到15,老早被淘汰了,不用管它,只需要记住这个名词即可 5.3AMQ15

2. kahaDB 消息存储 (5.4版本后默认 重要)

KahaDB消息存储是基于日志文件的存储方式,它是5.4版本之后默认存储方式。
在这里插入图片描述
在这里插入图片描述

证明

在ActiveMQ安装目录的conf/activemq.xml文件配置了ActiveMQ的默认持久化方式。
在这里插入图片描述
其中,directory属性值配置了KahaDB持久化方式日志所在目录,即data/kahadb。
官方参考地址:http://activemq.apache.org/kahadb
在这里插入图片描述

说明
  1. KahaDB可用于任何场景,提高了性能和恢复能力。消息存储使用一个事务日志和仅仅用一个索引文件来存储它所有的地址。事务日志用于保存持久化数据,相当于新华字典内容;索引文件作为索引指向事务日志,相当于新华字典目录。
  2. KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模型进行了优化。
    数据被追加到data logs中。当不再需要log文件中的数据的时候,log文件会被丢弃。
KahaDB的存储原理
  1. db-number.log(事务日志)
    KahaDB存储消息到预定大小的数据纪录文件中,文件名为db-number.log。当数据文件已满时,一个新的文件会随之创建,number数值也会随之递增,它随着消息数量的增多,如每32M一个文件,文件名按照数字进行编号,如db-1.log,db-2.log······。当不再有引用到数据文件中的任何消息时,文件会被删除或者归档。
    在这里插入图片描述

  2. db.data(索引文件)
    该文件包含了持久化的BTree索引,索引了消息数据记录中的消息,它是消息的索引文件,本质上是B-Tree(B树),使用B-Tree作为索引指向db-number.log里面存储消息。

  3. db.free
    记录当前db.data文件里面哪些页面是空闲的,文件具体内容是所有空闲页的ID,方便下次记录数据时,从空闲的页面开始建立索引,保证索引的连续型且没有碎片。

  4. db.redo
    用来进行消息恢复,如果KahaDB消息存储再强制退出后启动,用于恢复BTree索引。

  5. lock
    文件锁,表示当前kahadb独写权限的broker。

3. LevelDB消息存储(了解)

LevelDB文件系统是从ActiveMQ5.8之后引进的,它和KahaDB很相似,也是基于文件的本地数据库存储形式,但是它提供比KahaDB更快的持久性,但它不再使用自定义B-Tree实现来索引预写日志,而是使用基于LevelDB的索引。相对于KahaDB它具有如下更好的优点:

  • 快速更新(无需进行随机磁盘更新)
  • 并发读取
  • 使用硬链接快速索引快照

为什么LevelDB比KahaDB有着更好的性能,为什么现在使用KahaDB使用广泛呢?
按照官网的说法是:LevelDB存储已被弃用,不再支持或推荐使用,Replicated LevelDB(可复制的LevelDB)有望取代LevelDB。推荐的存储方式是KahaDB。参考官网地址:http://activemq.apache.org/leveldb-store

如何配置LevelDB?在ActiveMQ安装目录的conf/activemq.xml找到persistenceAdapter地方将原来默认的kahaDB进行如下修改:

 <persistenceAdapter>
 		<!--<kahaDB directory="${activemq.data}/kahadb"/> -->
        <levelDB directory="${activemq.data}/leveldb"/>
 </persistenceAdapter>

大 白 话 总 结 : 过 于 新 兴 的 技 术 , 现 在 有 些 不 确 定 。 \color{red}大白话总结:过于新兴的技术,现在有些不确定。

4. JDBC消息存储(重点)

JDBC持久化方式顾名思义就是将数据持久化到数据库中(如mysql)

原理图

在这里插入图片描述

实现步骤
  1. 添加mysql驱动到ActiveMQ安装目录的lib文件夹中
    在这里插入图片描述
  2. 配置ActiveMQ.xml
    在ActiveMQ安装目录的conf/activemq.xml中找到persistenceAdapter标签替换有以下内容:
    在这里插入图片描述
    dataSource是指定将要引用的持久化数据库的bean名称。
    createTableOnStartup是否在启动的时候创建数据库表,默认是true,这样每次启动都会去创建表了,一般是第一次启动的时候设置为true,然后再去改成false。
    大 白 话 理 解 : 就 像 是 H i b e r n a t e 可 以 指 定 表 的 生 成 策 略 , 如 果 设 置 为 t r u e , 则 每 次 启 动 都 会 去 新 建 这 套 表 , 这 里 我 就 手 动 建 表 \color{red}大白话理解:就像是Hibernate可以指定表的生成策略,如果设置为true,则每次启动都会去新建这套表,这里我就手动建表 Hibernatetrue
<!--  
<persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb"/>
      </persistenceAdapter>
-->
<persistenceAdapter>  
      <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true"/> 
</persistenceAdapter>

在这里插入图片描述
3. 数据库连接池配置
配置连接池之前先在数据库中建立一个数据库,比如我建立数据库名称为:mysql-ds

 <bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://自己数据库IP:3306/activemq?relaxAutoCommit=true"/> 
    <property name="username" value="自己数据库用户名"/> 
    <property name="password" value="自己数据库密码"/> 
    <property name="poolPreparedStatements" value="true"/> 
  </bean>

在ActiveMQ安装目录的conf/activemq.xml中的broker下面增加内容:
在这里插入图片描述

  1. 建库SQL和创表说明
    创建数据库
    在这里插入图片描述
    运行命令./activemq start启动服务,不出意外的话,启动成功后,将会在配置的数据库中生成相应的三张表。
    在这里插入图片描述
    在这里插入图片描述
    表 创 建 后 记 得 修 改 a c t i v e m q . x m l 的 j d b c P e r s i s t e n c e A d a p t e r 标 签 的 c r e a t e T a b l e s O n S t a r t u p 属 性 值 改 为 f a l s e 。 \color{red}表创建后记得修改activemq.xml的jdbcPersistenceAdapter标签的createTablesOnStartup属性值改为false。 activemq.xmljdbcPersistenceAdaptercreateTablesOnStartupfalse
ACTIVEMQ_MSGS:消息表,Queue和Topic都存在里面

在这里插入图片描述

ACTIVEMQ_ACKS:订阅关系表,如果是持久化Topic,订阅者和服务器的订阅关系保存在这个表

在这里插入图片描述

ACTIVEMQ_LOCK

在集群环境下才有用,只有一个Broker可以获取消息,称为Master Broker,其他的只能作为备份等待Master Broker不可用,才可能成为下一个Master Broker。这个表用于记录哪个Broker是当前的Master Broker。
在这里插入图片描述

脚下留心

若修改了activemq配置文件之后,启动不了,则通过

./activemq console

例如不小心将:createTablesOnStartup 写成 createTableOnStartup报错提示,它会具体到某一行
在这里插入图片描述
又入:不小心删除了关闭标签
在这里插入图片描述

详细看下一篇

连更文章

ActiveMQ专题0 —— 前言说明
ActiveMQ专题1 —— 入门概述
ActiveMQ专题2 —— ActiveMQ下载和安装(Linux版)
ActiveMQ专题3 ——Java编码实现ActiveMQ通讯(Queue)
ActiveMQ专题4 ——ActiveMQ专题4 ——Java编码实现ActiveMQ通讯(Topic)
ActiveMQ专题5 ——JMS规范和落地产品
ActiveMQ专题6 ——ActiveMQ的Broker
ActiveMQ专题7 —— Spring整合ActiveMQ
ActiveMQ专题8 —— SpringBoot整合ActiveMQ
ActiveMQ专题9 —— ActiveMQ的传输协议
ActiveMQ专题10 —— ActiveMQ的存储和持久化
ActiveMQ专题11 —— ActiveMQ的存储和持久化2 (续篇)
ActiveMQ专题12—— ActiveMQ之zookeeper集群
ActiveMQ专题13—— ActiveMQ高级特性
ActiveMQ专题14—— ActiveMQ高级特性2
$\color{red} 完结!后续推上有关消息队列的面试题目 $

小总结

知 道 的 越 多 , 不 知 道 的 越 多 , 希 望 对 你 有 帮 助 ! \color{red}知道的越多,不知道的越多,希望对你有帮助!

网站文章

  • Cause: java.lang.IllegalArgumentException

    Cause: java.lang.IllegalArgumentException

    背景概述:在练习Mybatis整合Spring使用传统DAO模式开发,最后Junit测试时报了这样的错误“Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for queryUserById”,很明显,我在测试“通过Id查询用户”这一 ...

    2024-04-01 00:52:49
  • LeetCode 4. 寻找两个正序数组的中位数(多解法)

    文章目录解法一:合并数组解法二:双指针解法三:二分解法三:进阶二分(划分数组) 解法一:合并数组 将两个数组合并后,直接根据下标找到中位数。时间复杂度O(m+n)O(m + n)O(m+n),空间复杂...

    2024-04-01 00:52:41
  • 趣学python算法一百例_DAY1

    趣学python算法一百例_DAY1

    一天应该1道,慢慢做 抓交通肇事犯 1.问题描述 一辆卡车违反交通规则,撞人后逃跑。现场有三人目击该事件,但都没有记住车号,只记下了车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数...

    2024-04-01 00:52:14
  • 使用 Git,10个最需要常备的后悔药 热门推荐

    使用 Git,10个最需要常备的后悔药 热门推荐

    Git是目前世界上最优秀最流行的分布式版本控制系统,也是程序员们日常使用最频繁的工具之一(几乎每天都需要使用它来对源代码进行版本管理)。 使用Git的过程,难免由于手快或者别的什么原因,需要对做过的事...

    2024-04-01 00:52:07
  • 基础计算机教研室都上什么课,计算机教研室简介

    计算机教研室现有教授1人、副教授7人、讲师5人,是一支教学实力雄厚、业务素质高、科研能力强,团结友爱的教师团队。截止2021年4月,现有专职教师计算机教研室专职教师(5人): 高谨、翟哲、李宗峰、石沙...

    2024-04-01 00:52:00
  • 本地化部署chatGLM开发实践报错汇总记录

    本地化部署chatGLM开发实践报错汇总记录

    最近因为项目需要在接触chatGLM相关的内容,本地化部署运行是其中之一,在这个学习实践过程中也遇上了很多报错,这里主要是对各种报错的记录汇总,也欢迎大家一起贡献问题与解决方案,希望的就是帮到同样有需要的人。

    2024-04-01 00:51:33
  • 【python脚本】正则匹配提取所需字符串

    python脚本通过正则表达式匹配原文档中所需的字符串,并输出至新的文档中。

    2024-04-01 00:51:23
  • LNK2005: _DllMain@12 already defined解决方案

    LNK2005: _DllMain@12 already defined解决方案

    原因:链接库顺序问题方案:在“项目 -> 属性 -> 链接器 -> 命令行”,使用 /verbose:lib编译参数,输出如下:>SearchingD:\vs2015\VC\lib\MSVCRTD.l...

    2024-04-01 00:51:16
  • JavaScript基础学习——ES6基础指令

    一、认识ES6ES6(ECMAScript 6/ECMAScript 2015)是2015年6月发布的。ES6是对ES5的一个扩展(就是在ES5的基础上添加了一些内容),最典型的内容:Class(类)...

    2024-04-01 00:51:10
  • 证券结算知识

    参考:结算业务 [证券信息技术知识库]目前,我国A股交易实行T+1交收,B股交易实行T+3交收,另外还有部分业务实行逐笔全额交收(Real Time Gross Settlement)、T+0、T+N...

    2024-04-01 00:50:44