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;硬盘中数据读取到游戏中&…