RabbitMQ死信队列未延迟消息:如何让重试消息从retry_exchange返回主队列
解决方案
问题出在你让main_queue直接绑定了retry_exchange的foo路由键,导致消费失败的消息被发送到retry_exchange时,会同时进入main_queue和retry_queue,所以没有延迟就直接重试了。要实现从retry_exchange延迟返回main_queue,需要调整路由逻辑:
- 移除
main_queue直接绑定retry_exchange的原路由键配置 - 给
retry_queue配置专属死信路由键,区分正常消息和重试消息 - 让
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
相关产品推荐
相关产品推荐

