我正在实现 RabbitMQ 以在另一台服务器上执行一些图像编辑操作。但是,有时请求可能会在源图像同步到该服务器之前到达该服务器 - 在这种情况下,我想将消息弹出回队列并在所有其他操作完成后处理它。
但是,使用重新提交位设置调用 basic.nack 会使我的队列立即重新接收该消息 - 在任何可以实际完成的操作之前。
目前我觉得我被迫实现一些逻辑,只是将原始消息重新提交给交换,但我想避免这种情况。既是因为同一条消息可能已在另一台服务器上成功处理(使用它自己的队列),也是因为我希望这是一种常见的模式,必须有更好的方法。
(哦,我在消费者和服务器代码中都使用 php-amqplib)
谢谢!
更新:按照 zaq178miami 的建议,我使用死信交换解决了我的问题
我目前的解决方案:
$dead_letter_exchange
在原始队列上声明死信交换$worker
- 宣布恢复交换
$recovery_exchange
- 声明一个队列
$dead_queue
,ax-message-ttl
为 5 秒并x-dead-letter-exchange
设置为$recovery_exchange
- 绑定
$dead_letter_queue
到$dead_letter_exchange
- 并绑定
$worker
到$recovery_exchange
$dead_letter_exchange
并且$recovery_exchange
是生成的名称,基于我正在消费的交换和价值$worker
使每条被 nack 的消息在五秒钟后仅在该特定队列(服务器)上返回给工作人员进行重试。我可能仍想应用一些在$n
重试后将消息丢弃的逻辑。
我仍然对更好的想法持开放态度;-)