热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

消息中间件ActiveMQ5:可持久化方式AMQ和KahaDB

文章目录ActiveMQ的持久化方式一、需要进行消息持久化的原因二、持久化方式1、AMQmessageStore(了解)2、KahaDB消息存储

文章目录

  • ActiveMQ 的持久化方式
    • 一、需要进行消息持久化的原因
    • 二、持久化方式
      • 1、AMQ message Store(了解)
      • 2、KahaDB消息存储(默认)


ActiveMQ 的持久化方式

一、需要进行消息持久化的原因

原因:

为了避免以外宕机以后丢失信息,需要做到重启之后可以恢复消息队列。消息系统一般都会采用持久化机制。

ActiveMQ的消息持久化机制有JDBCAMQKahaDB、和LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的。

思维导图:
在这里插入图片描述

存储逻辑:

就是在发送者将消息发送到MQ服务器后,消息中心首先将消息持久化到 本地数据文件、内存数据库或者远程库等,在试图将消息发送给接收者,成功则将消息从存储中删除,失败则继续尝试发送

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

二、持久化方式


1、AMQ message Store(了解)

AMQ使一种文件消息存储,它具有写入消息快的特点。

原理:

  • 写入消息时,会将消息按顺序追加到日志文件,性能很高。为了提升性能,创建消息主键索引,并且提供缓存机制,进一步提升性能。
  • 每个日志文件的大小都是有限制的(默认32m,可自行配置),当一个存储文件中的消息已经全部被消费,那么这个文件将会被表示为可删除,在下一个清除判断,这个文件会被删除
  • 当超过这个大小,系统会重新建立一个文件。当所有的消息都消费完成,系统会删除这个文件或者归档(取决于配置)。

缺点:

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

AMQ使用于5.3之前的版本,基于文件的存储方式,是以前默认的的消息存储,现在已经不使用了

2、KahaDB消息存储(默认)

ActiveMQ从5.4版本开始,推荐使用KahaDB,KahaDB是基于日志文件的

官方文档地址:

原理:

KahaDB的Architecture图:
在这里插入图片描述
过程解析:

在内存(cache)中的那部分B-Tree是Metadata Cache,通过将索引缓存到内存中,可以加快查询的速度(quick retrival of message data)。但是需要定时将 Metadata Cache 与 Metadata Store同步。

这个同步过程就称为:check point。由checkpointInterval选项 决定每隔多久时间进行一次checkpoint操作。

BTree Indexes则是保存在磁盘上的,称为Metadata Store,它对应于文件db.data,它就是对Data Logs以B树的形式 索引。有了它,Broker(消息服务器)可以快速地重启恢复,因为它是消息的索引,根据它就能恢复出每条消息的location

如果Metadata Store被损坏,则只能扫描整个Data Logs来重建B树了,这个过程是很复杂且缓慢的。

Data Logs则对应于文件 db-.log,默认是32MB,Data Logs以日志形式存储消息,它是生产者生产的数据的真正载体。
Redo Log则对应于文件 db.redo,redo log的原理用到了“Double Write”

kahadb在消息保存目录中只有4个文件和一个lock,跟ActiveMQ的却文件存储引擎相比这就非常简洁了。

4个文件和一个锁:

  • db-.log :KahaDB存储消息到预定大小的数据记录文件中,文件命名为db-.log。当数据文件已满时,一个新的文件会随之创建。number的数值也会递增,它随着消息数量的增多,如每32M一个文件,文件名安装数字进行依次编号当不再有引用到数据文件中的任何消息时文件会被删除或者归档
  • db.data : 该文件包含了持久化的BTree的索引,索引了消息数据记录中的消息,他是消息索引文件,本质上时B-Tree(B数),使用B-Tree作为索引指向db-.log里面的存储消息。
  • db.redo: 主要用来进行消息恢复。
  • db.free:当前db.data文件里面哪些时空闲的,文件具体内容时所有空闲页的ID
  • lock: 锁文件

KahaDB主要特性:

  • 日志形式存储消息;
  • 消息索引以B-Tree结构存储,可以快速更新;
  • 完全支持JMS事务;
  • 支持多种恢复机制;

在配置文件中我们可以看到下面的配置,说明的ActiveMQ默认使用的KahaDB
在这里插入图片描述
配置方式:

  • directory : 指定持久化消息的存储目录
  • journalMaxFileLength : 指定保存消息的日志文件大小,具体根据你的实际应用配置

<persistenceAdapter><kahaDB directory&#61;"${activemq.data}/activemq-data" journalMaxFileLength&#61;"16mb"/>
persistenceAdapter>

说明&#xff1a;

  • 目前默认的存储方式&#xff0c;可用于任何场景&#xff0c;提高了性能和恢复能力。
  • 消息存储使用一个事务日志和仅仅一个索引文件来存储它的所有地址。
  • kahaDB时专门针对消息持久化的解决方案&#xff0c;它对典型的消息使用模式进行了优化。
  • 数据被追加到data logs中&#xff0c;当不在需要log文件中的数据时&#xff0c;log文件会被丢弃。

推荐阅读
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • Flutter 布局(四) Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解
    本文主要介绍Flutter布局中的Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth四种控件,详细介绍了其布局 ... [详细]
author-avatar
kaiping2011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有