場景舉例:訂單生單成功后,30分鐘未支付自動取消
消息的ttl
- 隊列設(shè)置:
- x-expires:隊列ttl,當隊列未使用(沒有任何消費者、沒有被重新聲明、過期時間段內(nèi)未調(diào)用過Basic.Get命令)時,會被刪除。服務(wù)器重啟后,持久化的隊列過期時間會重新計算,x-expires單位為毫秒,不能設(shè)置為0
- x-message-ttl :隊列中消息的ttl
- 發(fā)布消息設(shè)置:
- expiration:單條消息ttl(若x-message-ttl也設(shè)置,取最短的ttl)
- 消息拋出
- 消息過期后,拋出需要滿足兩個條件,1個是消息過期,1個實在隊列頭部
- 若消息已過期,并且不在頭部,當消費者消費掉頭部未過期的消息之后,過期的消息仍會被拋出,不會被消費者消費掉。
死信交換器DLX:dead letter exchange
- dlx和普通交換器并沒有區(qū)別,可以綁定多個隊列
- 隊列聲明的時候,可以設(shè)置死信參數(shù)
- x-dead-letter-exchange 指定隊列的死信交換器
- x-dead-letter-routing-key 指定dlx的路由鍵,可與延遲隊列的路由鍵不同
- 消息滿足一定的條件會進入死信路由
- 一個消息被Consumer拒收了,并且reject方法的參數(shù)里requeue是false。也就是說不會被再次放在隊列里,被其他消費者使用。
- 消息過期
- 隊列的長度限制滿了。排在前面的消息會被丟棄或者扔到死信路由上。
延遲隊列的實現(xiàn)
image
- queue1作為延遲隊列,用于存儲消息等到過期后轉(zhuǎn)到任務(wù)隊列
- queue2作為任務(wù)隊列,已經(jīng)經(jīng)過延遲的消息,在這里被消費