rabbitmq延遲訊息

2022-06-12 04:00:10 字數 2076 閱讀 3868

使用rabbitmq來實現延遲訊息必須先了解rabbitmq的兩個概念:訊息的ttl和死信exchange,通過這兩者的組合來實現上述需求。 

訊息的ttl就是訊息的存活時間。rabbitmq可以對佇列和訊息分別設定ttl。對佇列設定就是佇列沒有消費者連著的保留時間,也可以對每乙個單獨的訊息做單獨的設定。超過了這個時間,我們認為這個訊息就死了,稱之為死信。

我們建立乙個佇列queue.temp,在arguments 中新增x-message-ttl 為5000 (單位是毫秒),那每乙個進入這個佇列的訊息在5秒後會消失。

乙個訊息在滿足如下條件下,會進死信交換機,記住這裡是交換機而不是佇列,乙個交換機可以對應很多佇列。

(1) 乙個訊息被consumer拒收了,並且reject方法的引數裡requeue是false。也就是說不會被再次放在佇列裡,被其他消費者使用。

(2)上面的訊息的ttl到了,訊息過期了。

(3)佇列的長度限制滿了。排在前面的訊息會被丟棄或者扔到死信交換機上。

dead letter exchange其實就是一種普通的exchange,和建立其他exchange沒有兩樣。只是在某乙個設定dead letter exchange的佇列中有訊息過期了,會自動觸發訊息的**,傳送到dead letterexchange中去。 

我們現在可以測試一下延遲佇列。

(1)建立死信交換器 exchange.ordertimeout (fanout)

(2)建立佇列queue.ordertimeout

(3)建立死信交換器 exchange.ordertimeout 與佇列queue.ordertimeout 之間的繫結

(4)建立佇列queue.ordercreate,arguments新增

x-message-ttl=10000

x-dead-letter-exchange: exchange.ordertimeout

(5)測試:向queue.ordercreate佇列新增訊息,等待10秒後訊息從queue.ordercreate佇列消失,

步驟:(1)建立死信交換器 exchange.ordertimeout (fanout)

(2)建立佇列queue.ordertimeout

(3)建立死信交換器 exchange.ordertimeout 與佇列queue.ordertimeout 之間的繫結

(4)建立佇列queue.ordercreate,arguments新增

(5)測試:向queue.ordercreate佇列新增訊息,等待10秒後訊息從queue.ordercreate佇列消失,

(5)專案中

org.springframework.amqp

spring-rabbit

serviceimpl:

@autowired

private

rabbittemplate rabbittemplate;

//傳送延遲訊息

rabbittemplate.convertandsend("","queue.ordercreate",orderid);

RabbitMQ延遲訊息的延遲極限是多少?

之前在寫spring cloud stream專題內容的時候,特地介紹了一下如何使用rabbitmq的延遲訊息來實現定時任務。最近正好因為開發碰到了使用過程中發現,延遲訊息沒有效果,訊息直接就被消費了的情況。因此就繼續深入研究了一下問題原因,在此記錄下來,給碰到類似問題的童鞋們參考。因為不是所有的訊...

Rabbitmq延遲佇列

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

RabbitMQ 延遲佇列

rabbitmq實現延遲佇列一 在佇列上設定ttl publish delaysync.exchange delay.5m.queue 延遲佇列 delay.exchange test.queue 正常佇列 consumer 延遲佇列start mapmap new hashmap map.put ...