天天看點

RabbitMq的死信隊列和延遲隊列

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

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

消息被拒絕

消息過期

隊列達到最大長度

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

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

定義交換機和隊列

RabbitMq的死信隊列和延遲隊列

進行測試:

具體因為隊列消息過期而被投遞到死信隊列的流程:

RabbitMq的死信隊列和延遲隊列

延遲隊列存儲的對象是對應的延遲消息;所謂“延遲消息” 是指當消息被發送以後,并不想讓消費者立刻拿到消息,而是等待特定時間後,消費者才能拿到這個消息進行消費。

在RabbitMQ中延遲隊列可以通過 <code>過期時間</code> + <code>死信隊列</code> 來實作;具體如下流程圖所示:

RabbitMq的死信隊列和延遲隊列

在上圖中;分别設定了兩個5秒、10秒的過期隊列,然後等到時間到了則會自動将這些消息轉移投遞到對應的死信隊列中,然後消費者再從這些死信隊列接收消息就可以實作消息的延遲接收。

延遲隊列的應用場景;如:

在電商項目中的支付場景;如果在使用者下單之後的幾十分鐘内沒有支付成功;那麼這個支付的訂單算是支付失敗,要進行支付失敗的異常處理(将庫存加回去),這時候可以通過使用延遲隊列來處理

在系統中如有需要在指定的某個時間之後執行的任務都可以通過延遲隊列處理

繼續閱讀