1. 程式人生 > >RabbitMQ訊息持久化

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)

相關推薦

RabbitMQ 訊息持久化、事務、Publisher的訊息確認機制

RabbitMQ  訊息持久化、事務、Publisher的訊息確認機制 1. 宣告MessageQueue 在RabbitMQ中,無論是生產者傳送訊息還是消費者接受訊息,都首先需要宣告一個MessageQueue。 這就存在一個問題,是生產者宣告還是消費者宣告呢?要解決這個

rabbitmq 訊息持久化問題

       在開發階段,研究過一遍rabbitmq的訊息持久化問題,以為完美。但沒有想到準備釋出版本,有個BUG沒有時間處理,拖著,重啟了伺服器,卻發現rabbitmq的訊息已丟失,沒有持久。。鄙視一下當時的自己。      查找了一下官方文件,我用得是紅色框框這種

RabbitMQ訊息持久化

一、前言   如果我們希望即使在RabbitMQ服務重啟的情況下,也不會丟失訊息,我們可以將Queue與Message都設定為可持久化的(durable),這樣可以保證絕大部分情況下我們的RabbitMQ訊息不會丟失。當然還是會有一些小概率事件會導致訊息丟失。 二、佇列持久化   2.1 檢視存在的佇列

RabbitMQ訊息的消費與持久化

作為消費者的客戶端要消費Rabbitmq的訊息,首先要建立與它某個佇列的連線,具體連線時可指定佇列的BindingKey和關係的exchange標識,Rabbitmq判斷若已有佇列通過BindingKey與exchange標識關聯則允許消費者消費佇列的訊息,否則新建一個佇列用指定的BindingKey與exc

RabbitMQ(三):訊息持久化策略

一、前言   在正常的伺服器執行過程中,時常會面臨伺服器宕機重啟的情況,那麼我們的訊息此時會如何呢?很不幸的事情就是,我們的訊息可能會消失,這肯定不是我們希望見到的結果。所以我們希望AMQP伺服器崩潰了也可以將訊息恢復,這稱之為訊息持久化。RabbitMQ自然存在這種策略可以幫助我們完成這件事情。 二、持

RabbitMQ訊息持久化(轉)

原文地址 https://blog.csdn.net/u013256816/article/details/60875666/   訊息的可靠性是RabbitMQ的一大特色,那麼RabbitMQ是如何保證訊息可靠性的呢——訊息持久化。 為了保證RabbitMQ在退出或者crash等異常

RabbitMQ訊息持久化

RabbitMQ訊息持久化需要將訊息和佇列都持久化 佇列持久化 //為Channel定義queue的屬性,queueName為queue名稱 第二個引數持久化標誌,為true表示持久化 chann

RabbitMQ應用例項Python版-訊息確認和訊息持久化

訊息確認 當處理一個比較耗時得任務的時候,你也許想知道消費者(consumers)是否執行到一半就掛掉。當前的程式碼中,當訊息被RabbitMQ傳送給消費者(consumers)之後,馬上就會在記憶體中移除。這種情況,你只要把一個工作者(worker)停止,正在處理的訊

RabbitMQ訊息佇列、路由器、訊息持久化

  如有錯誤還請斧正,謝謝 ```C# //入列 ConnectionFactory factory = new ConnectionFactory { HostName = "localhost", UserName = "You`rName", Password = "You`rPassw

RabbitMQ-訊息應答和訊息持久化

1.訊息應答 Ack (Message Acknowledgement) 訊息應答預設開啟 false autoAck = true (自動確認模式) 一旦rabbitMQ將訊息分發給消費者,就會從記憶體中刪除 這種情況下,如果消費者未處理完訊息就異常結束,

RabbitMQ訊息持久化(佇列持久化訊息持久化)

訊息的可靠性是RabbitMQ的一大特色,那麼RabbitMQ是如何保證訊息可靠性的呢——訊息持久化。  為了保證RabbitMQ在退出或者crash等異常情況下資料沒有丟失,需要將queue,exchange和Message都持久化。 queue的持久化 queue

RabbitMQ原理三--訊息持久化

原文地址:http://www.cnblogs.com/ericli-ericli/p/5938106.html問題及方案描述1.當有多個消費者同時收取訊息,且每個消費者在接收訊息的同時,還要處理其它的事情,且會消耗很長的時間。在此過程中可能會出現一些意外,比如訊息接收到一半

RabbitMQ實戰篇9-訊息持久化

在前面的第七和第八節我們講解了如何實現訊息的釋出和訂閱。同時也提到了一些問題,比如說如果RabbitMQ服務掛掉了,那麼我們的訊息也就丟失了。怎麼解決這樣的問題呢?這就需要我們將訊息進行持久化啦這節,我們就在原有的基礎上來講解訊息的持久化如何持久化其實,在之前我們已經將訊息進

RabbitMQ實戰-訊息持久化

在前面的第七和第八節我們講解了如何實現訊息的釋出和訂閱。同時也提到了一些問題,比如說如果RabbitMQ服務掛掉了,那麼我們的訊息也就丟失了。怎麼解決這樣的問題呢?這就需要我們將訊息進行持久化啦 這節,我們就在原有的基礎上來講解訊息的持久化 如何持久化 其實,在之前我們已

RabbitMQ(三)—訊息應答與訊息持久化

Message acknowledgment(訊息應答) 執行一個任務可能需要花費幾秒鐘,你可能會擔心如果一個消費者在執行任務過程中掛掉了。基於現在的程式碼,一旦RabbitMQ將訊息分發給了消費者,就會從記憶體中刪除。在這種情況下,如果殺死正在執行任務的消費

RabbitMQ 佇列訊息持久化

參考連結: https://www.cnblogs.com/Keep-Ambition/p/8044752.html  假如訊息佇列test裡面還有訊息等待消費者(consumers)去接收,但是這個時候伺服器端宕機了,這個時候訊息是否還在?  

RabbitMQ之佇列與訊息持久化

佇列持久化 在之前的例子中,我們所用的佇列都是臨時佇列,當服務重啟後之前建立的佇列就都沒有了。 佇列的持久化是在定義佇列時的第二個引數決定的(false為佇列不用持久化) channel.queueDeclare(queueName, false, false

RabbitMQ 交換機、佇列、訊息持久化

交換器持久化 Durable:是否持久化引數設為True即可 channel.exchangeDeclare(exchangeN

Storm框架:如何消費RabbitMq訊息(程式碼案例)

1、定義拓撲topology public class MessageTopology { public static void main(String[] args) throws Exception { //組裝topology TopologyBuilder

MassTransit RabbitMq 訊息整合命令與事件釋出

一.MassTransit    MassTransit 是一個免費開源輕量級的.net平臺下的訊息匯流排系統。我們將介紹如果使用MassTransit整合我們系統中的事件與命令。專案地址:https://github.com/MassTransit/MassTransit。本文使用一次簡單的下訂