• RabbitMQ消息持久化


    一、前言

      如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。当然还是会有一些小概率事件会导致消息丢失。

    二、队列持久化

      2.1 查看存在的队列和消息数量

      在windows环境下,在rabbitmq的安装目录/sbin下,通过rabbitmqctl.bat list_queues查看 

      这边启动了两个producer,分别生成两个队列hello 和 hello1,并且他们都有一个消息存在

      重启rabbitmq,模拟故障

      可以看到重启后两个队列都消失了

      2.2 持久化队列

      我们就hello队列持久化

      在声明队列名称时,持久化队列,生产端和消费端都要

    channel.queue_declare(queue='hello', durable=True)
    

      我们重复上面的操作,但是给hello队列做持久化,而hello1不做,并重启rabbitmq

      可以看到重启后,hello队列还在,hello1队列消失了,但是原本hello中的一条消息也没有保存下来。所以在这边我们仅仅做到了消息队列的持久化,还没有做消息持久化。

    三、消息持久化

      我们刚才实现了在rabbitmq崩溃的情况下,就队列本身保存下来,重启后队列还在。接下来我们要将消息也保存下来,即消息的持久化

    channel.basic_publish(exchange='',
                          routing_key='hello',
                          body='hello',
                          properties=pika.BasicProperties(
                              delivery_mode=2,  # make message persistent
                          ))
    
    # 增加properties,这个properties 就是消费端 callback函数中的properties
    # delivery_mode = 2  持久化消息
    

      生产端生成一个消息,并重启rabbitmq

      可以看到,经过队列和消息持久化后的hello, 在重启的情况下,队列和消息都存在,没有消失。

      消费端再重启后也能正常接收

      

    四、总结

    1. 队列持久化需要在声明队列时添加参数 durable=True,这样在rabbitmq崩溃时也能保存队列
    2. 仅仅使用durable=True ,只能持久化队列,不能持久化消息
    3. 消息持久化需要在消息生成时,添加参数 properties=pika.BasicProperties(delivery_mode=2)
  • 相关阅读:
    解题:NOI 2007 社交网络
    解题:2018九省联考 一双木棋
    125. 背包问题 II
    152. 组合
    140. 快速幂
    148. 颜色分类
    144. 交错正负数
    83. 落单的数 II
    124. 最长连续序列
    59. 最接近的三数之和
  • 原文地址:https://www.cnblogs.com/bigberg/p/8195622.html
Copyright © 2020-2023  润新知