天天看點

Rabbit 進階操作

Rabbit 進階操作

過期時間TTL表示可以對消息設定預期的時間,在這個時間内都可以被消費者接收擷取;過了時間之後消息将自動被删除。

RabbitMQ可以對消息和隊列設定TTL。目前有兩種方法可以設定。

第一種方法是通過隊列屬性設定,隊列中所有消息都有相同的過期時間。

第二種方法是對消息進行單獨設定,每條消息TTL可以不同。

如果上述兩種方法同時使用,則消息的過期時間以兩者之間TTL較小的那個數值為準。消息在隊列的生存時間一旦超過設定的TTL值,就稱為dead message被投遞到死信隊列, 消費者将無法再收到該消息。

運作之後,可以進入網站中檢視該隊列:

剛運作時:

Rabbit 進階操作

運作6s後:

Rabbit 進階操作

這樣可以給這條​<code>​message​</code>​ 設定過期時間,如果上述兩種方法同時使用,則消息的過期時間以兩者之間TTL較小的那個數值為準。是以會 ​<code>​5s​</code>​ 過期。

DLX,全稱為Dead-Letter-Exchange , 可以稱之為死信交換機,也有人稱之為死信郵箱。當消息在一個隊列中變成死信(dead message)之後,它能被重新發送到另一個交換機中,這個交換機就是DLX ,綁定DLX的隊列就稱之為死信隊列。

消息變成死信,可能是由于以下的原因:

消息被拒絕

消息過期

隊列達到最大長度

DLX也是一個正常的交換機,和一般的交換機沒有差別,它能在任何的隊列上被指定,實際上就是設定某一個隊列的屬性。當這個隊列中存在死信時,Rabbitmq就會自動地将這個消息重新釋出到設定的DLX上去,進而被路由到另一個隊列,即死信隊列。

要想使用死信隊列,隻需要在定義隊列的時候設定隊列參數 ​<code>​x-dead-letter-exchange​</code>​ 指定交換機即可。

Rabbit 進階操作

6s之後:

Rabbit 進階操作

發送了三條資訊,而設定的消息隊列長度為​<code>​2​</code>​,這樣最先發送的​<code>​第1個消息​</code>​會進入死信隊列:

Rabbit 進階操作
Rabbit 進階操作

延遲隊列存儲的對象是對應的延遲消息;所謂“延遲消息” 是指當消息被發送以後,并不想讓消費者立刻拿到消息,而是等待特定時間後,消費者才能拿到這個消息進行消費。在RabbitMQ中延遲隊列可以通過 ​<code>​過期時間​</code>​ + ​<code>​死信隊列​</code>​ 來實作;

先啟動 ​<code>​消費者​</code>​ ,開啟監聽,在啟動 ​<code>​生産者​</code>​ 發送消息。

這時候可能出現錯誤:

Rabbit 進階操作
這個問題是因為你建立的交換機已經存在,可以去rabbitmq網站中,删除對應交換機。

再次運作就成功了:

Rabbit 進階操作
Rabbit 進階操作