ActiveMQ 消息存储持久化

ActiveMQ中对于投递模式设置为持久化的消息,broker接收到到消息之后,会先把消息存储到存储介质,然后再转发到消息的监听者
ActiveMQ持久化方式:AMQ、KahaDB、JDBC、LevelDB
持久化配置路径:ActiveMQ\apache-activemq\conf\activemq.xml

官方文档: http://activemq.apache.org/persistence.html

Message保存方式

  1. PERSISTENT:保存到磁盘,consumer消费之后,message被删除。
  2. NON_PERSISTENT:保存到内存,消费之后message被清除。

kahaDB 持久化为日志文件(默认)

所有消息顺序添加到一个日志文件中,同时另外有一个索引文件记录指向这些日志的存储地址,还有一个事务日志用于消息恢复操作。

特点:基于文件的本地数据库储存形式,是一个支持事务,可靠,高性能,可扩展的消息存储器。

data/kahadb这个目录下,会生成四个文件,来完成消息持久化

  1. db.data它是消息的索引文件,本质上是B-Tree(B树),使用B-Tree作为索引指向db-*.log里面存储的消息。
    一旦这个消息不在被需要,数据文件可以被删除或归档。
  2. db.redo用来进行消息恢复
  3. db-*.log存储消息内容。新的数据以APPEND的方式追加到日志文件末尾。属于顺序写入,因此消息存储是比较快的。默认是32M,达到阀值会自动递增
  4. lock文件锁,写入当前获得kahadb读写权限的broker ,用于在集群环境下的竞争处理
<persistenceAdapter>
    <kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="32mb"/>
</persistenceAdapter>

JDBC 基于第三方数据库

使用JDBC持久化方式,数据库默认会创建3个表,每个表的作用如下:

  1. activemq_msgs:queue和topic的消息都存在这个表中
  2. activemq_acks:存储持久订阅的信息和最后一个持久订阅接收的消息ID
  3. activemq_lock:跟kahadb的lock文件类似,确保数据库在某一时刻只有一个broker在访问

步骤:

  1. 将用来保存数据的数据库的连接jar包放到ActiveMQlib下,如:mysql就是commons-dbcp-1.4``mysql-connector-java-8.0.9``commons-pool-1.6
  2. conf下的ActiveMQ.xml文件中persistenceAdapter标签下的<kahaDB directory="${activemq.data}/kahadb"/>
    <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>代替
    createTablesOnStartup是否在启动的时候创建数据表,默认值是true,这样每次启动都会去创建数据表了,一般是第一次启动的时候设置为true,之后改成false
  3. 在conf下的ActiveMQ.xml文件中在</broker>后面``<import/>前面添加相关数据库的DataSource``bean
  4. 创建相关数据库ld:对应数据库的url配置
  5. 启动ActiveMQ,如果ld下自动建立了三张表,证明持久化成功
<beans>
    <broker>
        <persistenceAdapter>
            <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false" />
        </persistenceAdapter>
    </broker>
    ?
    <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/ld?relaxAutoCommit=true"/>?
        <property name="username" value="root"/>
        <property name="password" value="aaa"/>
        <property name="maxActive" value="200"/>? ?
        <property name="poolPreparedStatements" value="true"/>?
    </bean>
</beans>

JDBC Message Store with ActiveMQ Journal(高速缓存)

这种方式克服了JDBC Store的不足,JDBC存储每次消息过来,都需要去写库和读库ActiveMQ Journal,使用延迟存储数据到数据库,当消息来到时先缓存到文件中,延迟后才写到数据库中

如果消费者的消费速度很快的情况下,在journal文件还没有同步到DB之前,消费者已经消费了90%的以上的消息,那么这个时候只需要同步剩余的 10%的消息到DB。

配置方式,先把原来的jdbc持久化配置去掉,加入以下配置

    <broker>
        <persistenceFactory>
            <journalPersistenceAdapterFactory
            journalLogFiles="4"
            journalLogFileSize="32768"
            useJournal="true"
            useQuickJournal="true"
            dataSource="#mysql-ds"
            dataDirectory="activemq-data" />
        </persistenceFactory>
    </broker>

原文地址:https://www.cnblogs.com/loveer/p/11407959.html

时间: 2024-10-15 10:43:31

ActiveMQ 消息存储持久化的相关文章

ActiveMQ(09):ActiveMQ消息存储持久化

一.简介 1.1 描述 ActiveMQ不仅支持persistent和non-persistent两种方式,还支持消息的恢复(recovery)方式.重新投递等 1.2 PTP与PUB/SUB 1.2.1 PTP 对于持久化订阅主题,每一个消费者将获得一个消息的复制. 1.2.2 PUB/SUB 对于持久化订阅主题,每一个消费者将获得一个消息的复制. 1.3 有效的消息存储 ActiveMQ提供了一个插件式的消息存储,类似于消息的多点传播,主要实现了如下几种: 1:AMQ消息存储-基于文件的存储

ActiveMQ消息存储持久化

--------------------------------------------------------------------------------------------------- ActiveMQ提供了插件式的消息存储,主要有有如下几种: 1.AMQ消息存储-基于文件的存储方式,是以前的默认消息存储 2.KahaDB消息存储-提供了容量的提升和恢复能力,是现在的默认存储方式 3.JDBC消息存储-消息基于JDBC存储的 4.Memory消息存储-基于内存的消息存储 下面就分别

activemq的高级特性:消息存储持久化

activemq的高级特性之消息存储持久化 有基于文件的,数据库的,内存的.默认的是基于文件的,在安装目录/data/kahadb.在conf/activemq.xml文件中. <persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter> 把存储持久化换成mysql的数据库. 1:修改配置文件 <persistenceAdapte

ActiveMQ 消息存储

深入浅出 JMS(四) - ActiveMQ 消息存储 一.消息的存储方式 ActiveMQ 支持 JMS 规范中的持久化消息与非持久化消息 持久化消息通常用于不管是否消费者在线,它们都会保证消息会被消费者消费.当消息被确认消费后,会从存储中删除 非持久化消息通常用于发送通知以及实时数据,通常要求性能优先,消息可靠性并不是必须的情况 MQ 支持可插拔式的消息存储,如:内存.文件和关系数据库等方式 Queue 消息模型在 ActiveMQ 的存储: 采用存储采用先进先出(FIFO),一个消息只能被

JMS消息持久化,将ActiveMQ消息持久化到mySql数据库中

ActiveMQ5.8.0版本采用kahadb作为默认的消息持久化方式.使用默认的持久化机制,我们不容易直接看到消息究竟是如何持久的.ActiveMQ提供的JDBC持久化机制,能够将持久化信息存储到数据库.通过查看数据库中ActiveMQ生成的表结构和存储的数据,能够帮助我们更好的了解消息的持久化机制.现在介绍如何配置activemq,将数据持久化到mysql中. 1.配置activeMQ需要的mySql数据源 为了能够使用JDBC访问mysql数据库,显然必须要配置消息服务器的数据库源.在ac

activemq的持久化部署与验证

Activemq是著名的消息队列产品,而持久化指的是在mq挂掉的时候,消息不会被抛弃,而是会被继续保存,等待进程复活.这个Activemq的持久化功能必须在5.9版本以上才会实现,而现在官方最新的mq版本是5.14.1,笔者的这个实验也是使用5.14.1版本,实验工具是金山云,规格是2核4G无外网. #wget http://www.apache.org/dyn/closer.cgi?filename=/activemq/5.14.1/apache-activemq-5.14.1-bin.tar

ActiveMQ消息持久化-JDBC

JDBC 可以将消息存储到数据库中,例如:Mysql.SQL Server.Oracle.DB2. 使用JDBC持久化方式,数据库会创建3个表:activemq_msgs,activemq_acks和activemq_lock. 一.配置方式(Oracle): conf/acticvemq.xml <beans>   <broker brokerName="test-broker" persistent="true" xmlns="htt

ActiveMQ消息持久化机制

为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制. ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的. 就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件.内存数据库或者远程数据库等,然后试图将消息发送给接收者,发送成功则将消息从存储中删除,失败则继续尝试. 消息中心启动以后首先要检查制定的存储位置,如果有未发送成功的消息,则需要把消息发送出去. >>

ActiveMQ消息持久化-KahaDB

KahaDB KahaDB是从ActiveMQ 5.4开始默认的持久化插件. KahaDb恢复时间远远小于其前身AMQ并且使用更少的数据文件,所以可以完全代替AMQ.(AMQ适用于ActiveMQ5.3之前的版本.) KahaDB的持久化机制同样是基于日志文件,索引和缓存. 一.配置方式: activemq.xml <persistenceAdapter>       <kahaDB directory="${activemq.data}/kahadb"/> &