日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RabbitMQ延迟消息的极限是多少?

發布時間:2024/7/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RabbitMQ延迟消息的极限是多少? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

問題定位

因為不是所有的消息都出現了沒有延遲消息效果的因素,通過有問題的消息特征,大致猜測可能是延遲時間過長導致了消息延遲失敗。為了驗證這個原因,先拿之前文章中的例子,來測試一下延遲時間是否與問題直接相關。

對之前的延遲消息使用樣例(文末的Git倉庫中可以獲取完整代碼)接口做一下微改,增加了一個請求參數delay來控制延遲時間:

@GetMapping("/sendMessage")
public String messageWithMQ(@RequestParam String message, @RequestParam Long delay) {
log.info("Send: " + message);
testTopic.output().send(MessageBuilder.withPayload(message).setHeader("x-delay", delay).build());
return "ok";
}

然后嘗試發起了兩個請求:

請求1:延遲5000毫秒。消息發送到MQ之后確實延遲了5秒之后才得到了消費,沒有任何問題。

curl localhost:8080/sendMessage?message=hello&delay=5000

請求2:延遲1年(31536000000毫秒)。消息發送到MQ之后馬上就被消費者消費了,完全沒有延遲效果。

curl localhost:8080/sendMessage?message=hello&delay=31536000000

問題小結

在明確了問題原因之后,需要對該功能的時候做一些明確的限定(延遲時間的極限),以避免再次出現類似的問題。深入探索下去,這里的失敗主要與消息的過期時間(TTL)有直接的關系。在RabbitMQ中,消息的過期時間必須是非負 32 位整數,即:0 <= n <= 2^32-1,以毫秒為單位。 其中,2^32-1 = 4294967295。

這里我們可以嘗試下面兩個請求,分別設置延遲時間為4294967295何4294967296:

curl localhost:8080/sendMessage?message=hello&delay=4294967295
curl localhost:8080/sendMessage?message=hello&delay=4294967296

可以發現,當延遲時間為4294967295毫秒的時候,延遲消息工作正常;當延遲時間為4294967296毫秒的時候,消息被直接消費,沒有延遲效果。

所以,我們在使用RabbitMQ的延遲消息功能時候,必須注意它的延遲極限是4294967295毫秒。如果你的業務需求會超過這個臨界值,就必須避開這個坑,采用其他方法來實現需要延遲或者定時執行的任務了。

代碼示例

本文示例讀者可以通過查看下面倉庫的中的stream-delayed-message項目:

  • Github: https://github.com/dyc87112/SpringCloud-Learning/tree/master/4-Finchley
  • Gitee: https://gitee.com/didispace/SpringCloud-Learning/tree/master/4-Finchley

如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支持!


總結

以上是生活随笔為你收集整理的RabbitMQ延迟消息的极限是多少?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。