如何用RabbitMQ實現延遲佇列
阿新 • • 發佈:2021-02-03
# 前言
在 `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(){