美文网首页
ActiveMQ的消息存储和持久化

ActiveMQ的消息存储和持久化

作者: 笨比乔治 | 来源:发表于2020-12-03 09:31 被阅读0次

    九、ActiveMQ的消息存储和持久化(重要啊啊啊啊!!!)

    1、官网:http://activemq.apache.org/persistence

    2、是什么?

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

    ActiveMQ的消息持久化机制有AMQ,JDBC,KahaDB 和 levelDB,无论采取哪种持久化方式,消息的存储逻辑都是一致的

    在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件,内存数据库或者远程数据库等,再试图将消息发送给接收者,成功则将消息从存储中删除,失败则继续尝试发送

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

    3、有哪些存储方式

    1)AMQ message store

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

    2)kahaDB消息存储

    基于日志文件,从ActiveMQ5.4开始的默认的持久化插件

    验证:

    activemq.xml文件中:

    <persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>
    
    image.jpeg

    kahaDB的存储原理:

    KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力

    消息存储使用了一个事务日志和一个索引文件存储消息所有的地址

    KahaDB是一个专门针对消息持久化的解决方案

    数据被追加到data logs中,当不再需要log文件中数据的时候,log文件会被丢弃

    image.jpeg image.jpeg

    3)JDBC消息存储(真实的存储到数据库中)

    4)LevelDB 消息存储

    image.jpeg

    5)JDBC Message Store With ActiveMQ Journal

    4、JDBC消息存储

    1、MQ+MySql

    image.jpeg

    2、添加mysql数据库的驱动包到activeMQ下的lib文件夹

    image.jpeg

    3、 jdbcPersistenceAdapter配置

    image.jpeg

    修改配置文件activemq.xml。将之前的替换为jdbc的配置。如下:

    <!-- 
    <persistenceAdapter>
                <kahaDB directory="${activemq.data}/kahadb"/>
          </persistenceAdapter>
    -->
    <persistenceAdapter> 
          <jdbcPersistenceAdapter dataSource="#mysql-ds" />
    </persistenceAdapter>
    

    4、 数据库连接池配置

    在activemq.xml 配置文件 标签和<import>标签之间插入数据库连接池配置</import>

    格式:

    image.jpeg

    我的配置:(按照自己的需要填写)

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

    5、 建库SQL和创表说明

    1)建立一个名为activemq的数据库

    image.jpeg

    2)三张表的说明

    image.jpeg

    ACTIVEMQ_MSGS:

    image.jpeg

    6、代码运行验证

    一定要开启持久化:

    messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
    

    7、数据库情况

    8、总结

    image.jpeg

    9、开发中的常见问题

    image.jpeg
    10.6 总结
    ① jdbc效率低,kahaDB效率高,jdbc+Journal效率较高。
    ② 持久化消息主要指的是:MQ所在服务器宕机了消息不会丢试的机制。
    ③ 持久化机制演变的过程:
    从最初的AMQ Message Store方案到ActiveMQ V4版本退出的High Performance Journal(高性能事务支持)附件,并且同步推出了关于关系型数据库的存储方案。ActiveMQ5.3版本又推出了对KahaDB的支持(5.4版本后被作为默认的持久化方案),后来ActiveMQ 5.8版本开始支持LevelDB,到现在5.9提供了标准的Zookeeper+LevelDB集群化方案。

    ④ ActiveMQ消息持久化机制有:
    AMQ 基于日志文件
    KahaDB 基于日志文件,从ActiveMQ5.4开始默认使用
    JDBC 基于第三方数据库
    Replicated LevelDB Store 从5.9开始提供了LevelDB和Zookeeper的数据复制方法,用于Master-slave方式的首选数据复制方案。

    相关文章

      网友评论

          本文标题:ActiveMQ的消息存储和持久化

          本文链接:https://www.haomeiwen.com/subject/guaebktx.html