摘要:問題定位因為不是所有的消息都出現了沒有延遲消息效果的因素,通過有問題的消息特征,大致猜測可能是延遲時間過長導致了消息延遲失敗。所以,我們在使用的延遲消息功能時候,必須注意它的延遲極限是毫秒。
之前在寫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/S...
Gitee: https://gitee.com/didispace/S...
如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支持!
歡迎關注我的公眾號:程序猿DD,獲得獨家整理的學習資源和日常干貨推送。如果您對我的專題內容感興趣,也可以關注我的博客:didispace.com
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75551.html
摘要:然而實際業務中還存在另外一種定時任務,它可能需要一些觸發條件才開始定時,比如編寫博文時候,設置小時之后發送。在消息監聽類中,對通道定義了,這里會對延遲消息做具體的邏輯。由于消息的消費是延遲的,從而變相實現了從消息發送那一刻起開始的定時任務。 應用場景 我們在使用一些開源調度系統(比如:elastic-job等)的時候,對于任務的執行時間通常都是有規律性的,可能是每隔半小時執行一次,或者...
摘要:官方插件僅支持版本中支持。使用過程聲明消息交換機實現實現消息發送實現實現 官方插件僅支持>=3.6.x 版本中支持。 本文描述的消息延遲機制采用官方推薦的插件rabbitmq-delayed-message-exchange,如精通rabbitmq和編程,請自行查看官方文檔,描述更加詳盡: github Rabbitmq插件列表 安裝 需要在集群每臺機器中安裝由于rabbitmq并...
摘要:另一種就是用中的位于包下,本質是由和實現的阻塞優先級隊列。表明了一條消息可在隊列中存活的最大時間。當某條消息被設置了或者當某條消息進入了設置了的隊列時,這條消息會在時間后死亡成為。 SpringBoot 是為了簡化 Spring 應用的創建、運行、調試、部署等一系列問題而誕生的產物,自動裝配的特性讓我們可以更好的關注業務本身而不是外部的XML配置,我們只需遵循規范,引入相關的依賴就可...
摘要:基礎組件架構設計基礎組件封裝設計迅速消息發送支持迅速消息發送模式,在一些日志收集統計分析等需求下可以保證高性能,高吞吐量。基礎組件封裝設計事務消息發送支持事務消息,且保障可靠性投遞,在金融行業單筆大金額操作時會有此類需求。 Rabbitmq基礎組件架構設計 基礎組件封裝設計 - 迅速消息發送支持迅速消息發送模式,在一些日志收集、統計分析等需求下可以保證高性能,高吞吐量。 基礎組件封...
閱讀 3162·2023-04-25 17:19
閱讀 616·2021-11-23 09:51
閱讀 1339·2021-11-08 13:19
閱讀 776·2021-09-29 09:34
閱讀 1673·2021-09-28 09:36
閱讀 1494·2021-09-22 14:59
閱讀 2708·2019-08-29 16:38
閱讀 2053·2019-08-26 13:40