很多人一失败就这么写:
ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)这当然能让消息回队列,但它常常不是你真正想要的“重试系统”。
为什么?
因为它更像:
派送员拿到包裹 -> 发现送不了 -> 立刻扔回货架
下一秒又被自己或旁边派送员拿到 -> 再失败 -> 再扔回去这叫“热循环”。
后果通常是:
- CPU 空转
- 日志爆炸
- 外部依赖被打爆
- 队列一直抖动
所以更健康的基础重试心智通常是:
失败
-> 不直接 requeue
-> 进入 retry queue
-> 等 TTL 到期
-> 再回主队列也就是本篇完整示例里的:
- 主队列失败后 dead-letter 到重试交换机
- 重试队列 TTL 10 秒
- TTL 到期后再回主交换机
- 超过重试上限,送死信队列
这才像真正的“延迟重试”。