全书目录

第二十一篇:RabbitMQ 完全指南 —— 城市智能快递调度中心宇宙

第九章:重试的基础,不是“无限 requeue”

1 分钟 208 字 第 391 / 962 个阅读单元

很多人一失败就这么写:

python
ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)

这当然能让消息回队列,但它常常不是你真正想要的“重试系统”。

为什么?

因为它更像:

text
派送员拿到包裹 -> 发现送不了 -> 立刻扔回货架
下一秒又被自己或旁边派送员拿到 -> 再失败 -> 再扔回去

这叫“热循环”。

后果通常是:

  • CPU 空转
  • 日志爆炸
  • 外部依赖被打爆
  • 队列一直抖动

所以更健康的基础重试心智通常是:

text
失败
-> 不直接 requeue
-> 进入 retry queue
-> 等 TTL 到期
-> 再回主队列

也就是本篇完整示例里的:

  • 主队列失败后 dead-letter 到重试交换机
  • 重试队列 TTL 10 秒
  • TTL 到期后再回主交换机
  • 超过重试上限,送死信队列

这才像真正的“延迟重试”。