相關知識
什麼是延遲隊列
隊列中的消息在等待指定時間後,消費者才能夠進行消費。
應用場景
商城系統,下單後半個小時未付款,自動取消訂單
實現方式
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的消息訂閱中,模擬了業務邏輯,進行重試或者轉發至失敗隊列
失敗隊列的訂閱處理中一般會進行數據的持久化,以方便後續人工介入進行業務處理