rabbitmq 通过 rabbitmq_delayed_message_exchange 插件实现毫秒级延迟消息,需版本严格对齐、启用插件、声明 x-delayed-message 类型交换机,发送时设置 x-delay 头,消费无需改造。

RabbitMQ 本身不原生支持延迟消息,但通过官方插件 rabbitmq_delayed_message_exchange 可以直接、精准地实现毫秒级延迟调度。相比 TTL+死信队列方案,它避免了队头阻塞、无需死信配置、每条消息可独立设置延迟时间,是当前主流且推荐的实现方式。
插件安装:版本对齐是关键
插件必须与 RabbitMQ 主版本严格一致,否则会报错 unknown exchange type 'x-delayed-message'。例如 RabbitMQ 3.12.x 必须使用插件 3.12.x 版本。
- 查看当前 RabbitMQ 版本:
rabbitmqctl status | grep "RabbitMQ" - 前往 GitHub 发布页 下载对应版本的
.ez文件 - 将文件复制到插件目录(常见路径:
/usr/lib/rabbitmq/plugins/或$RABBITMQ_HOME/plugins/) - 启用插件:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange - 重启 RabbitMQ 服务使插件生效
声明延迟交换机与队列
需定义一个类型为 x-delayed-message 的自定义交换机,并绑定普通队列。Spring AMQP 中推荐使用配置类方式声明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 交换机声明:调用
ExchangeBuilder.directExchange(...).delayed().build(),或手动创建CustomExchange并设置参数x-delayed-type=direct - 队列声明:普通持久化队列即可,无需特殊参数
- 绑定关系:使用
BindingBuilder.bind(queue).to(exchange)完成绑定,路由键按需指定
发送带延迟的消息
发送时在消息属性中添加 x-delay 头,单位为毫秒。Spring AMQP 提供两种常用方式:
- 方式一(推荐):使用
MessagePostProcessor设置头信息rabbitTemplate.convertAndSend(exchange, routingKey, message, msg -> { msg.getMessageProperties().setHeader("x-delay", 5000); return msg; }); - 方式二:构造
Message对象并显式设置头,再调用send()
注意:延迟时间最大建议不超过 48 小时(约 2 天),超出可能影响插件内部定时器稳定性。
消费与注意事项
消费者无需任何改造,仍从绑定的队列正常接收消息——插件会在延迟到期后自动将消息投递到该队列。
- 消息不会进入死信队列,除非显式拒绝且未配置重试
- 若开启
publisher-returns,延迟消息在未路由成功时可能触发 return 回调,需做好判空处理 - 延迟消息暂存在 Mnesia 数据库中,大量长期延迟消息可能占用内存,建议结合业务做清理或归档










