1. 程式人生 > >如何用RabbitMQ實現延遲佇列

如何用RabbitMQ實現延遲佇列

# 前言 在 `jdk` 的 `juc` 工具包中,提供了一種延遲佇列 `DelayQueue`。延遲佇列用處非常廣泛,比如我們最常見的場景就是在網購或者外賣平臺中發起一個訂單,如果不付款,一般 `15` 分鐘後就會被關閉,這個直接用定時任務是不好實現的,因為每個使用者下單的時間並不確定,所以這時候就需要用到延遲佇列。 # 什麼是延遲佇列 延遲佇列本身也是佇列,只不過這個佇列是延遲的,意思就是說當我們把一條訊息放入延遲佇列,訊息並不會立刻出隊,而是會在到達指定時間之後(或者說過了指定時間)才會出隊,從而被消費者消費。 ## 利用死信佇列實現延遲佇列 `RabbitMQ` 中的死信佇列就是用來儲存特定條件下的訊息,那麼假如我們把這個條件設定為指定時間過期(設定帶`TTL` 的訊息或者佇列),就可以用來實現延遲佇列的功能。 1. 新建一個 `TtlDelayRabbitConfig` 配置類(省略了包名和匯入),訊息最開始傳送至 `ttl` 訊息佇列,這個佇列中所有的訊息在 `5` 秒後過期,後期後會進入死信佇列: ```java @Configuration public class TtlDelayRabbitConfig { //路由ttl訊息交換機 @Bean("ttlDelayFanoutExchange") public FanoutExchange fanoutExchange(){ return new FanoutExchange("TTL_DELAY_FANOUT_EXCHANGE"); } //ttl訊息佇列 @Bean("ttlDelayQueue") public Queue ttlQueue(){