ActiveMQ--消息存储和持久化

  1.  官网(这里的持久化和前面说的消息持久化是不同的,前面的消息持久化,事务签收都是说的MQ服务器本机,而这里的持久化说的是与本机相连的数据库的数据持久化,包括:kahadb,JDBC等)
    • 为了保证高可用,消息不仅在本机MQ存储(持久化)一份,还要再数据库中持久化一份来保证高可用。
    • http://activemq.apache.org/persistence
    •  

  2. 是什么
    1. 面试题
    2. 回忆redis持久化机制有几种
    3. 说明:一句话:MQ服务器down机了,消息不会丢失的机制
      •  
                  
  3. 有那些
    1. AMQ Message store(了解)
    2. KahaDB 消息存储(默认)
      • 基于日志的文件,从ActiveMQ5.4开始默认的持久化插件 
      • 官网
        •   
      • 验证当前持久化使用的默认的存储机制
        •   
            
      • 说明:http://activemq.apache.org/kahadb
        •  

            
      • KahaDB的存储原理 (微型数据,有索引有数据,有备份,有锁机制)(kahaDB目录文件下包括:四个文件一把锁)
        •  

           

        •  

    3. JDBC消息存储
    4. LevelDDB消息存储(了解)基于文件存储的数据库
      •  

         

          
    5. JDBC Messae store with ActiveMQ Joural  
  4. jdbc消息存储
    1. MQ+MySQL

      •   

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

      •     

    3.  jdbcPersistenceAdapter配置

        •  

          <persistenceAdapter>
          <jdbcPersistenceAdapter dataSource= "#mysql-ds"/>
          </persistenceAdapter>

           

           

            
    4. 数据库连接池配置

      •  

        <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://172.29.64.226:3306/activemq?relaxAutoCommit=true"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        <property name="maxTotal" value="200"/>
        <property name="poolPreparedStatements" value="true"/>
        </bean>

          
    5. 建仓sQL和建表说明

      1. 新建一个名为activemq的数据库
      2. 三张表说明
        • ACTIVEMQ_MSGS
          •  

             

             

              
        • ACTIVEMQ_ACKS
          •   
        • ACTIVEMQ_LOCK  
          •  

             

              
      3. 如果建立数据库ok+上述配置ok+代码运行ok,三表自会自动形成
      4. 万一情况,手动建表sql(如果配置好无需手动,应急使用手动)  
    6. 代码运行验证

      1.  一定要持久化(默认为持久化的消息)
        1. messageProducer . setDeliveryMode (DeliveryMode. PERSISTENT); 
        2. 非持久化的消息不会存储到jdbc数据库中的表中 
        3. 队列和topic都的消息都记录在activemq_msgs表中
        4. 启动队列中的消息被消费后会从表中删除,而topic的消息不会被删除会一直在表存储
      2. 队列:
        1.  

        2.    

      3. topic: 
        1.  消费者先运行
          1.  

             

          2.  

             

             

        2. 在运行发布者发布消息(发布者发布的消息会保存到表中,就算被订阅者接受消费也不会删除)

          1.  

             

             

          2.  

             

             

          3.    
    7. 数据库情况

      1. 一单运行产生code
        • 点到点的
        • 发布订阅的类型 
      2. mysql
        • 在运行消费者看看表activemq_msgs 数据变换情况    
        • 先启消费的订阅者在运行生产,看看表activemq_acks      
    8. 小总结

      1. 队列中的消息保存到activemq_msgs表中
      2. topic中的消息保存到activemq_msgs ,topic的订阅者都保存到activemq_scks

      3.   
    9. 开发有坑

      1.  

         

          

          
  5. JDBC Message store with ActiveMQ Journal
    1. 是什么:(高速缓存配置)说明,在数据库和MQ中间当一层高速缓存 :journal 日志
    2. 配置
    3. 重启配置文件激活
    4. 运行   
      1. 生产者生产了消息,在mq中可以找到,但是在数据库中不会及时出现,但是消费者也是也以消费到的,这既是因为jorunal的存在
      2. 生产者生产的消息会先和journal 高速缓存打交道,不会直接存到数据库中了。
      3. 但是不影响消费者,消费者消费的消息也会从journal中获取。
        1.  

  6.  持久化机制小总结

    1. 消息生产之后,会先存储到journal中,这是如果有消费者将将消息消费了会从journal中删除,就不会将这些数据存到数据库中了,减小了数据库的压力,

    2. 若一直没有消费者消费等几分钟后journal中的消息才会存储到数据库中 

    3.  

       

       

       

       

       

               
posted @ 2021-05-29 21:58  张紫韩  阅读(212)  评论(0编辑  收藏  举报