RabbitMQ 延時隊列插件安裝與使用詳解(基于 Delayed Message Plugin)

RabbitMQ 延時隊列插件安裝與使用詳解(基于 Delayed Message Plugin)

  • 📌 一、什么是 RabbitMQ 延時隊列?
  • 🚀 二、安裝前準備
    • ? RabbitMQ 環境要求
  • 🔧 三、安裝延時隊列插件
    • 🧩 插件名稱:
    • 1?? 下載插件
    • 2?? 復制插件到插件目錄
    • 3?? 啟用插件
    • 4?? 重啟 RabbitMQ 容器(建議)
    • 5?? 驗證插件是否啟用成功
    • 6?? 配置容器重啟時自動加載插件
  • 🧪 四、使用延時隊列功能(Java 示例)
    • 📝 創建延時交換機與隊列
    • 📨 發送延時消息
  • 🔒 五、注意事項
  • 🧰 六、Web 管理界面配置示例
  • 📌 七、延時隊列 VS RabbitMQ 原生 TTL 實現
  • ? 八、常見問題 FAQ
    • 1. 插件安裝后沒有效果?
    • 2. 插件是否與集群兼容?
  • 🏁 總結

RabbitMQ 默認并不支持“真正意義上的延遲隊列”。實現延時消息最常用的方式就是安裝 rabbitmq_delayed_message_exchange 插件。
本文將從插件安裝、啟用、配置、使用全流程帶你掌握 RabbitMQ 延時隊列的正確姿勢。


📌 一、什么是 RabbitMQ 延時隊列?

延時隊列的核心功能就是:讓消息延遲一定時間后再投遞到消費者

典型應用場景包括

  • 訂單支付超時取消

  • 秒殺未支付自動釋放庫存

  • 用戶注冊后延時發送歡迎郵件

  • 自動關閉未操作的工單等


🚀 二、安裝前準備

? RabbitMQ 環境要求

  • RabbitMQ ≥ 3.6.x
  • Erlang ≥ 19.x(越新越好)
  • 插件版本需與 RabbitMQ 版本匹配(注意版本兼容

Docker 搭建 RabbitMQ
https://blog.csdn.net/weixin_44876263/article/details/147245253?sharetype=blogdetail&sharerId=147245253&sharerefer=PC&sharesource=weixin_44876263&spm=1011.2480.3001.8118


🔧 三、安裝延時隊列插件

🧩 插件名稱:

rabbitmq_delayed_message_exchange

1?? 下載插件

你可以從 GitHub 或 RabbitMQ 官網下載預編譯的 .ez 文件。

🔗 插件發布地址:

  • https://www.rabbitmq.com/community-plugins.html

在這里插入圖片描述

  • GitHub 地址:https://github.com/rabbitmq/rabbitmq-delayed-message-exchange

進入web端后左上角有顯示當前安裝的RabbitMQ版本
在這里插入圖片描述

需要保證RabbitMQ插件的大版本與RabbitMQ保持一致,否則會啟動失敗

例如(RabbitMQ 4.0.*):

在這里插入圖片描述

wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v4.0.7/rabbitmq_delayed_message_exchange-v4.0.7.ez

2?? 復制插件到插件目錄

將插件拷貝到容器內plugins目錄下

docker cp /root/rabbitmq_delayed_message_exchange-v4.0.7.ez rabbitmq:/plugins

.ez 文件復制進去:

// 進入容器 我這里使用容器名字 也可以用容器id進入
docker exec -it rabbitmq /bin/bash// 移動到plugins目錄下
cd plugins// 查看是否上傳成功
ls

在這里插入圖片描述


3?? 啟用插件

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

輸出類似:
在這里插入圖片描述

檢查插件是否存在于鏡像中
容器內執行:

rabbitmq-plugins list

在這里插入圖片描述

這表明:

? 插件 rabbitmq_delayed_message_exchange 已經啟用并正在運行。


4?? 重啟 RabbitMQ 容器(建議)

docker restart rabbitmq

5?? 驗證插件是否啟用成功

容器啟動成功之后,登錄RabbitMQ的管理界面(ip:15672 訪問web界面),找到ExchangesTab頁。點擊Add a new exchange,在Type里面查看是否有x-delayed-message選項,如果存在就代表插件安裝成功。

在這里插入圖片描述

6?? 配置容器重啟時自動加載插件

為了確保 RabbitMQ 容器每次重啟時自動啟用指定插件,需要在容器內 /etc/rabbitmq/enabled_plugins 文件中配置插件列表。

  1. 進入正在運行的容器:

    docker exec -it <容器名稱或ID> /bin/bash
    
  2. 編輯或創建插件配置文件 /etc/rabbitmq/enabled_plugins,寫入如下內容:

    [rabbitmq_management, rabbitmq_delayed_message_exchange].
    

    在這里插入圖片描述

  3. 保存文件并退出容器。

  4. 重新啟動容器,確認插件自動啟用:

    docker restart <容器名稱或ID>
    
  5. 通過 RabbitMQ 管理界面或命令行確認插件狀態:

    docker exec <容器名稱或ID> rabbitmq-plugins list
    

備注:

  • 確保掛載的配置目錄(包含 enabled_plugins 文件)權限正確,容器內 RabbitMQ 進程能正常讀取。
  • enabled_plugins 文件必須以 Erlang 列表格式并以句點 . 結尾。
  • 也可通過環境變量或啟動命令方式啟用插件,但寫入 enabled_plugins 文件更持久、可靠。

🧪 四、使用延時隊列功能(Java 示例)

延時消息的核心是:通過一個特殊的 Exchange 類型 x-delayed-message + 自定義 header 設置延遲時間


📝 創建延時交換機與隊列

/*** 聲明延遲隊列(Queue 本身無 TTL,延遲由消息屬性 x-delay 控制)* 注意:需要安裝 RabbitMQ 的延遲消息插件(rabbitmq_delayed_message_exchange)*/@Beanpublic Queue delayQueue() {return QueueBuilder.durable(getRetry().getQueue()).build();}/*** 聲明延遲交換機:必須使用插件類型 x-delayed-message,并聲明延遲基礎類型為 direct*/@Beanpublic CustomExchange delayExchange() {Map<String, Object> args = new HashMap<>();args.put("x-delayed-type", "direct");return new CustomExchange(getRetry().getExchange(),      // 名稱"x-delayed-message",           // 類型(延遲消息插件)true,                          // durablefalse,                         // auto-deleteargs                           // 參數:聲明 delayed 類型為 direct);}/*** 綁定延遲隊列到延遲交換機*/@Beanpublic Binding delayBinding() {return BindingBuilder.bind(delayQueue()).to(delayExchange()).with(getRetry().getRoutingKey()).noargs();}

📨 發送延時消息

/*** 默認延遲 30 分鐘(1800000 毫秒)*/public void sendDelayedTask(String message) {this.sendDelayedTask(message, 30 * 60 * 1000);}/*** 發送延遲消息*/public void sendDelayedTask(String message, long delayMillis) {MessageProperties properties = new MessageProperties();properties.setContentType(MessageProperties.CONTENT_TYPE_JSON);properties.setHeader("x-delay", delayMillis); // 設置延遲時間(單位:毫秒)Message amqpMessage = new Message(message.getBytes(StandardCharsets.UTF_8), properties);rabbitTemplate.send(rabbitMqProperties.getConfig().getRetry().getExchange(),rabbitMqProperties.getConfig().getRetry().getRoutingKey(),amqpMessage);log.info("延遲任務已發送,延遲 {} s 后投遞: {}", delayMillis/1000, message);}

🔒 五、注意事項

  • 插件啟用后,RabbitMQ 會新增一種交換機類型 x-delayed-message
  • 不兼容 RabbitMQ 自帶的 TTL + DLX 延遲實現方案
  • 插件僅支持設置 發送時延遲,不支持基于隊列統一延遲
  • 插件不支持所有 AMQP 客戶端(需顯式支持 header 設置的客戶端)

🧰 六、Web 管理界面配置示例

你也可以通過 RabbitMQ 的 Web 控制臺:

  1. 創建交換機類型為 x-delayed-message
  2. 設置參數 x-delayed-type = direct
  3. 綁定隊列
  4. 消息發布時設置 header:x-delay: 10000(單位 ms)

📌 七、延時隊列 VS RabbitMQ 原生 TTL 實現

方案支持粒度精準控制依賴 DLX靈活性復雜度
原生 TTL + 死信隊列隊列級 / 消息級一般中等中等
延時插件 rabbitmq_delayed_message_exchange消息級

? 八、常見問題 FAQ

1. 插件安裝后沒有效果?

  • 檢查是否重啟 RabbitMQ
  • 檢查交換機類型是否正確設置為 x-delayed-message
  • 檢查消息是否設置了 header:x-delay

2. 插件是否與集群兼容?

支持,只需確保每個節點都安裝啟用了插件


🏁 總結

通過安裝 rabbitmq_delayed_message_exchange 插件,RabbitMQ 擁有了真正意義上的“消息級”延遲投遞功能,無需依賴死信隊列和 TTL,極大簡化了延時場景的開發與維護工作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91762.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue項目使用ssh2-sftp-client實現打包自動上傳到服務器(完整教程)

告別手動拖拽上傳&#xff01;本教程將手把手教你如何通過ssh2-sftp-client實現Vue項目打包后自動上傳到服務器&#xff0c;提升部署效率300%。&#x1f680;一、需求場景與解決方案在Vue項目開發中&#xff0c;每次執行npm run build后都需要手動將dist目錄上傳到服務器&#…

《質光相濟:Three.js中3D視覺的底層交互邏輯》

在Three.js搭建的虛擬維度中,光照與材質的關系遠非技術參數的簡單疊加,當光線以數字形態穿越虛空,與物體表面相遇的瞬間,便開始書寫屬于這個世界的物理敘事——每一縷光斑的形狀、每一塊陰影的濃淡、每一寸肌理的反光,都是對現實光學規律的轉譯與重構。理解這種交互的深層…

無刷電機在汽車領域的應用與驅動編程技術

文章目錄引言一、核心應用場景1. 新能源汽車動力系統2. 底盤控制系統3. 車身與舒適系統4. 智能駕駛與安全系統二、無刷電機的技術優勢解析三、無刷電機驅動編程基礎1. 驅動原理2. 驅動架構四、核心控制算法與實現1. 六步換向法&#xff08;梯形波控制&#xff09;算法流程圖C語…

【游戲引擎之路】登神長階(十八):3天制作Galgame引擎《Galplayer》——無敵之道心

游戲引擎開發記錄&#xff1a;2024年 5月20日-6月4日&#xff1a;攻克2D物理引擎。 2024年 6月4日-6月13日&#xff1a;攻克《3D數學基礎》。 2024年 6月13日-6月20日&#xff1a;攻克《3D圖形教程》。 2024年 6月21日-6月22日&#xff1a;攻克《Raycasting游戲教程》。 2024年…

kotlin kmp 跨平臺環境使用sqldelight

歡迎訪問我的主頁: https://heeheeaii.github.io/ 1. 項目結構 SQLDelightKMPDemo/ ├── shared/ │ ├── src/ │ │ ├── commonMain/kotlin/ │ │ ├── androidMain/kotlin/ │ │ ├── desktopMain/kotlin/ │ │ └── commonMain/sqldel…

機器學習【五】decision_making tree

決策樹是一種通過樹形結構進行數據分類或回歸的直觀算法&#xff0c;其核心是通過層級決策路徑模擬規則推理。主要算法包括&#xff1a;ID3算法基于信息熵和信息增益選擇劃分屬性&#xff1b;C4.5算法改進ID3&#xff0c;引入增益率和剪枝技術解決多值特征偏差&#xff1b;CART…

簡單記錄一下VSCode中的一些學習記

在剛開始學習VSCode時&#xff0c;相信大家都會好奇VSCode底部區域那幾個不同的狀態欄具體有什么作用&#xff08;輸出、調試控制臺、終端、端口&#xff09;&#xff0c;貌似好像都是輸出與代碼相關的信息的&#xff1f;貌似代碼運行結果既可以出現在輸出中&#xff0c;也可以…

基于 Hadoop 生態圈的數據倉庫實踐 —— OLAP 與數據可視化(二)

目錄 二、Hive、SparkSQL、Impala 比較 1. SparkSQL 簡介 2. Hive、SparkSQL、Impala 比較 &#xff08;1&#xff09;功能 &#xff08;2&#xff09;架構 &#xff08;3&#xff09;場景 3. Hive、SparkSQL、Impala 性能對比 &#xff08;1&#xff09;cloudera 公司…

C++:std::array vs 原生數組 vs std::vector

&#x1f4cc; C&#xff1a;std::array vs 原生數組 vs std::vector 引用&#xff1a; C/C 標準庫 std::vector、std::array、原生靜態數組 的區別有哪些&#xff1f; 深度剖析&#xff1a;std::vector 內存機制與 push_back 擴容策略 今天過去了 還有許許多個明天 能和大…

Hyper-V + Centos stream 9 搭建K8s集群(二)

一、安裝自動補全主節點安裝就可以yum install -y bash-completion echo source <(kubectl completion bash) >>~/.bashrc kubectl completion bash >/etc/bash_completion.d/kubectl二、安裝Calico網絡插件&#xff08;主節點&#xff09;下載文件wget https://ca…

VBA代碼解決方案第二十七講:禁用EXCEL工作簿右上角的關閉按鈕

《VBA代碼解決方案》(版權10028096)這套教程是我最早推出的教程&#xff0c;目前已經是第三版修訂了。這套教程定位于入門后的提高&#xff0c;在學習這套教程過程中&#xff0c;側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…

Spring AI 系列之三十一 - Spring AI Alibaba-基于Nacos的MCP

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…

sqli-labs:Less-12關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $uname".$uname."; $passwd".$passwd."; $sql"SELECT username, password FROM users WHERE username($uname) and password($passwd) LIMIT 0,1";注入類型&#xff1a;字符串型&#xff0…

【SpringAI】8.通過json動態添加mcp服務

前言 官方示例的代碼中&#xff0c;mcp一般是配置到yml中或者json文件中&#xff0c;使用自動裝配的方式注入服務&#xff0c;這種方式不方便在程序啟動后添加新的服務&#xff0c;這里參考cherry studio的方式動態添加mcp服務 1.確定方案 mcp服務的維護放到mysql業務數據庫維…

【PDF + ZIP 合并器:把ZIP文件打包至PDF文件中】

B站鏈接 PDF ZIP 合并器&#xff1a;把ZIP文件打包至PDF文件中_嗶哩嗶哩_bilibiliz 加強作者的工具 https://wwgw.lanzn.com/i8h1C32k9bef 密碼:30cv 新增c框架&#xff0c;加快運行速度

阿里云部署微調chatglm3

git Ifs install Git lfs 主要用于管理大型文件。在傳統的Git倉庫中&#xff0c;所有文件內容都會被完整記錄在每一次提交中&#xff0c;這會導致倉庫體積增大&#xff0c;克隆、拉取和推送操作變慢&#xff0c;甚至可能超出存儲限額。Git LFS通過將大文件替換成文本指針&#…

Linux網絡編程 ---五種IO模型

五種IO模型一、IO慢的原因二、五種IO模型三、如何設置非阻塞式IO&#xff1f;一、IO慢的原因 二、五種IO模型 阻塞式IO 非阻塞式IO 信號驅動IO 多路轉接 異步IO 三、如何設置非阻塞式IO&#xff1f; &#xff08;一&#xff09;用法說明 &#xff08;二&#xff0…

Obsidian結合CI/CD實現自動發布

CI/CDQuickAddJS腳本bat腳本sh腳本實現自動發版Hugo文章 需求來源 每次手動執行Hugo的命令&#xff0c;手動把public文件夾上傳到自己的服務器可以完成發版需求。 但是&#xff0c;作為一個內容創作者&#xff0c;我更希望的關注于自己的內容&#xff0c;而不是關注整個發版…

[硬件電路-141]:模擬電路 - 源電路,信號源與電源,能自己產生確定性波形的電路。

源電路&#xff08;Source Circuit&#xff09;是電子系統中為其他電路或負載提供特定信號或能量的基礎電路模塊&#xff0c;其核心功能是生成、調節或轉換所需的物理量&#xff08;如電壓、電流、波形、頻率等&#xff09;。以下是源電路的詳細解析&#xff1a;一、源電路的核…

Unity_數據持久化_PlayerPrefs基礎

Unity數據持久化 一、數據持久化基礎概念 1.1 什么是數據持久化 定義&#xff1a; 數據持久化就是將內存中的數據模型轉換為存儲模型&#xff0c;以及將存儲模型轉換為內存中的數據模型的統稱。 通俗解釋&#xff1a; 將游戲數據存儲到硬盤&#xff0c;硬盤中數據讀取到游戲中&…