You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RabbitMQ死信队列未延迟消息:如何让重试消息从retry_exchange返回主队列

解决方案

问题出在你让main_queue直接绑定了retry_exchange的foo路由键,导致消费失败的消息被发送到retry_exchange时,会同时进入main_queue和retry_queue,所以没有延迟就直接重试了。要实现从retry_exchange延迟返回main_queue,需要调整路由逻辑:

  1. 移除main_queue直接绑定retry_exchange的原路由键配置
  2. 给retry_queue配置专属死信路由键,区分正常消息和重试消息
  3. 让main_queue通过这个专属路由键绑定retry_exchange,接收延迟后的重试消息

修改后的代码如下:

connection = Bunny.new('url_for_rabbitmq', verify_peer: true)
connection.start
channel = connection.create_channel

# 创建主交换机和重试交换机
exchange = channel.direct('main_exchange')
retry_exchange = channel.direct('retry_exchange')

# 主队列配置:消费失败时将消息死信到retry_exchange,路由键为'foo'
queue = channel.queue('main_queue', durable: true, arguments: { 
  'x-dead-letter-exchange' => retry_exchange.name,
  'x-dead-letter-routing-key' => 'foo'
})
queue.bind(exchange, routing_key: 'foo')

# 重试队列配置:TTL设为10秒,到期后死信到retry_exchange,路由键改为'retry.foo'
retry_queue = channel.queue('retry_queue', durable: true, arguments: { 
  'x-message-ttl' => 10000, # 修正为10秒(10000毫秒)
  'x-dead-letter-exchange' => retry_exchange.name,
  'x-dead-letter-routing-key' => 'retry.foo'
})
retry_queue.bind(retry_exchange, routing_key: 'foo')

# 主队列绑定retry_exchange的'retry.foo'路由键,接收延迟后的重试消息
queue.bind(retry_exchange, routing_key: 'retry.foo')

逻辑说明:

  • 当main_queue中的消息消费失败(需调用nack(requeue: false)或reject(requeue: false)),消息会被发送到retry_exchange的foo路由键,进入retry_queue等待10秒
  • retry_queue中的消息到期后,会被死信到retry_exchange的retry.foo路由键
  • 绑定了该路由键的main_queue会收到这条延迟后的消息,完成重试流程

内容的提问来源于stack exchange,提问作者r3b00t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:50:27