RabbitMQ
RabbitMQ 本质是 AMQP 协议的一个开源实现,在详细介绍 RabbitMQ 之前,我们先来看一下 AMQP 的内部结构图

info
Version: rabbitmq:3.12.4-management
Plugins:
rabbitmq学习
RabbitMQ 使用 AMQP,概念体系包括:
- Exchange(direct/fanout/topic/headers)
- Binding
- Queue
- RoutingKey
- vHost
- Channel
安装
docker-compose.yml
version: "3"
services:
rabbitmq:
image: rabbitmq:3.12.4-management
container_name: rabbitmq
ports:
- "5672:5672" # AMQP
- "15672:15672" # Web 管理界面
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=123456
- LANG=C.UTF-8
- LANGUAGE=C.UTF-8
- LC_ALL=C.UTF-8
# volumes:
# - /opt/docker_data/rabbitmq_data:/var/lib/rabbitmq
访问 http://ip:15672/#/ 可以看到 Exchanges 等信息。
延时队列
什么是延时队列
延时队列,首先,它是一种队列,队列意味着内部的元素是有序的,元素出队和入队是有方向性的,元素从一端进入,从另一端取出。
其次,延时队列,最重要的特性就体现在它的延时属性上,跟普通的队列不一样的是,普通队列中的元素总是等着希望被早点取出处理,而延时队列中的元素则是希望被在指定时间得到取出和处理,所以延时队列中的元素是都是带时间属性的,通常来说是需要被处理的消息或者任务。
简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。
什么时候/场景需要使用延时队列
- 订单在十分钟之内未支付则自动取消。
- 新创建的店铺,如果在十天内都没有上传过商品,则自动发送消息提醒。
- 账单在一周内未支付,则自动结算。
- 用户注册成功后,如果三天内没有登陆则进行短信提醒。
- 用户发起退款,如果三天内没有得到处理则通知相关运营人员。
- 预定会议后,需要在预定的时间点前十分钟通知各个与会人员参加会议。
- …
如何利用RabbitMQ实现延时队列需求
延时情况分两类:消息队列有相同的延时、每条消息有不同的延时。
内置的死信队列
创建一个延时队列、一个延时交换机、延时routingKey。
和一个立即队列、一个立即交换机、立即routingKey。
如上组件的关系如下图:


在延时队列里指定如下:
- x-dead-letter-exchange 声明了队列里的死信转发到的DLX名称,(对应立即交换机)
- x-dead-letter-routing-key 声明了这些死信在转发时携带的 routing-key 名称,(对应立即routingKey)
- x-message-ttl 队列中消息的过期时间(注意消息上也可以设置过期时间),两者若同时设置取其小
即可。
x-delayed-message(插件)
安装过程
安装一个插件即可:https://www.rabbitmq.com/community-plugins.html
- 下载插件:访问 rabbitmq-delayed-message-exchange GitHub 仓库,找到并下载与你的 RabbitMQ 版本相对应的插件文件(通常是 .ez 或 .tar.gz 格式)。
- 停止 RabbitMQ 服务:在安装之前,停止 RabbitMQ 服务以避免冲突。
- 复制插件文件:将下载并解压后的 .ez 文件复制到 RabbitMQ 安装目录下的 plugins 文件夹中。
- 启动 RabbitMQ 服务:启动 RabbitMQ 服务。
- 启用插件:打开命令行,进入 RabbitMQ 的 sbin 目录,并执行命令
rabbitmq-plugins enable rabbitmq_delayed_message_exchange来启用插件。 - 重启RabbitMQ。
选择
如果你的系统中延迟消息很多 → 强烈推荐 x-delayed-message
理由:
- 不产生死信
- 不需要两个队列
- 延迟精确
- 支持随时变更 delay
- 性能更高
参考
- 【RabbitMQ】一文带你搞定RabbitMQ延迟队列 - 弗兰克的猫 - 博客园
- 延迟队列 redission 延迟队列实现订单超时mob64ca13faa4e6的技术博客51CTO博客
- 如何解决RabbitMQ中的延迟消息问题-阿里云开发者社区
- 关于RabbitMQ实现延迟消息之大家避而不谈的坑望周知-腾讯云开发者社区-腾讯云
作者:张三 创建时间:2025-09-15 13:46
最后编辑:张三 更新时间:2025-11-26 16:14
最后编辑:张三 更新时间:2025-11-26 16:14