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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM