RabbitMQ應(yīng)用之延遲隊列

場景舉例:訂單生單成功后,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)過延遲的消息,在這里被消費
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容