SpringBoot2.0實戰(13)整合RabbitMQ之實現延遲隊列、消息重試

相關知識

什麼是延遲隊列

隊列中的消息在等待指定時間後,消費者才能夠進行消費。

應用場景

商城系統,下單後半個小時未付款,自動取消訂單

實現方式

RabbitMQ 本身沒有直接支持延遲隊列功能,但是通過控制消息的生存時間及死信隊列,可以模擬出延遲隊列的效果。

RabbitMQ 控制消息的生存時間有兩種方法:

  • 設置隊列屬性(x-message-ttl),隊列中所有消息都有相同的過期時間
  • 設置消息屬性(expiration),擁有單獨的過期時間

關於死信隊列可以參考 https://gitee.com/gongm_24/spring-boot-tutorial/tree/master/chapter18

目標

整合 Spring boot 提供的 spring-boot-starter-amqp,實現延遲隊列

操作步驟

添加依賴

添加後的整體依賴如下

 

定義隊列

定義一個測試隊列 TestDeadQueue,併爲該隊列配置死信隊列,配置的方法就是在聲明隊列的時候,添加參數 x-dead-letter-exchange 及 x-dead-letter-routing-key,其實就是在消費失敗時,將消息使用該 exchange 及 routing 發送至指定隊列

 

消息接收方

 

測試代碼

消息重試

使用延時消息我們還可以實現一種業務場景:延遲的消息重試。
有些時候我們可能以爲一些原因,導致消息在某一時段處理的失敗,但是假如馬上進行重試可能會再次失敗,我們希望稍後對其進行處理且設置一個可控的重試次數。此時我們可以在延遲消息中進行修改來實現消息重試。

重試的流程

根據上面的設計,我們需要三個消息隊列workQueue業務隊列、retryQueue重試隊列、failedQueue失敗隊列。

配置exchange和queue

workQueue

業務處理所訂閱的內容,普通隊列

retryQueue

延時隊列,其配置了死信相關參數,其死信隊列爲workqueue

failedQueue

重試次數超過上限後的消息處理隊列,沒有額外處理

配置消息發送者

配置消息監聽者

在對work_queue的消息訂閱中,模擬了業務邏輯,進行重試或者轉發至失敗隊列

失敗隊列的訂閱處理中一般會進行數據的持久化,以方便後續人工介入進行業務處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章