2010-02-26 56 views
34

據我所知,2個選項可供選擇:什麼是AMQP中的「傳送模式」?

  • 「非持久性」
  • 「老大難」

但是,這實際上意味着什麼呢?

「非持久性」如下:如果沒有消費者,AMQP結構將嘗試傳遞消息,則消息將被丟棄?

「持久性」如下:AMQP將重試消息,直到消費者接受它?

回答

26

@jldupont - @nos說的。標記爲「持久」的郵件將傳遞到「持久」隊列中,並記錄到磁盤中。發生崩潰時持久隊列會被恢復,以及在崩潰之前存儲的任何持久性消息。有關詳細信息,我建議在郵件列表上詢問,或者查看rabbitmq網站上的各種背景信息。如果您有任何疑問,請致電聯繫與我們聯繫。

乾杯

亞歷

+0

謝謝亞歷克西斯! – jldupont 2010-03-01 14:37:33

+0

我不明白你爲什麼可以聲明Exchange持久。另一方面,你「可以」!?宣佈一個隊列「對應」該Exchange不耐用?或者,例如,如果您要聲明Exchange NONDURABLE,但隊列可以持久化,並且會發生崩潰。我可以在非持久性交換中恢復那個持久隊列嗎? @alexis – Detached 2013-06-27 13:52:38

+2

「持久性」僅意味着Exchange或隊列將在服務器重新啓動後存活下來。這並不意味着存儲在持久隊列中的消息將存活下來......這也會要求消息級屬性'.deliveryMode = 2' 。 (我只是測試了這些情況) – Myobis 2014-01-06 09:04:38

12

delivery_mode在AMQP確定是否將消息代理重新啓動之後被存儲在磁盤上。您可以將郵件標記爲持久性 - 當你在PHP(PECL AMQP擴展)發佈消息 例如通過塞汀delivery_mode property = 2

$exchange->publish($text, $routingKey, null, array('delivery_mode' => 2)); 

您還需要申報隊列耐用(或將經紀人停止後丟棄)

$queue->setFlags(AMQP_DURABLE);