天天看點

rabbitmq死信隊列和延時隊列的使用

死信隊列&死信交換器:DLX 全稱(Dead-Letter-Exchange),稱之為死信交換器,當消息變成一個死信之後,如果這個消息所在的隊列存在x-dead-letter-exchange參數,那麼它會被發送到x-dead-letter-exchange對應值的交換器上,這個交換器就稱之為死信交換器,與這個死信交換器綁定的隊列就是死信隊列。

死信消息:

  1. 消息被拒絕(Basic.Reject或Basic.Nack)并且設定 requeue 參數的值為 false
  2. 消息過期了
  3. 隊列達到最大的長度

過期消息:

    在 rabbitmq 中存在2種方可設定消息的過期時間,第一種通過對隊列進行設定,這種設定後,該隊列中所有的消息都存在相同的過期時間,第二種通過對消息本身進行設定,那麼每條消息的過期時間都不一樣。如果同時使用這2種方法,那麼以過期時間小的那個數值為準。當消息達到過期時間還沒有被消費,那麼那個消息就成為了一個 死信 消息。

    隊列設定:在隊列申明的時候使用 x-message-ttl 參數,機關為 毫秒

    單個消息設定:是設定消息屬性的 expiration 參數的值,機關為 毫秒

延時隊列:在rabbitmq中不存在延時隊列,但是我們可以通過設定消息的過期時間和死信隊列來模拟出延時隊列。消費者監聽死信交換器綁定的隊列,而不要監聽消息發送的隊列。

有了以上的基礎知識,我們完成以下需求:

需求:使用者在系統中建立一個訂單,如果10s後,使用者沒有進行支付,那麼自動取消訂單。

分析:

        1、上面這個情況,我們就适合使用延時隊列來實作,那麼延時隊列如何建立

        2、延時隊列可以由 過期消息+死信隊列 來時間

        3、過期消息通過隊列中設定 x-message-ttl 參數實作

        4、死信隊列通過在隊列申明時,給隊列設定 x-dead-letter-exchange 參數,然後另外申明一個隊列綁定x-dead-letter-exchange對應的交換器。

僞代碼如下:

rabbitmq死信隊列和延時隊列的使用

消息大緻流轉過程

rabbitmq死信隊列和延時隊列的使用

完整代碼:

代碼如下:https://gitee.com/huan1993/rabbitmq/tree/master/rabbitmq-advance/src/main/java/com/huan/rabbitmq/advance/dlx

繼續閱讀