app.conf.task_annotations = {
  'tasks.call_partner': {'max_retries': 5, 'retry_backoff': 2, 'retry_backoff_max': 600}
}

下游接口返回 503 后,队列在 12 分钟内堆到 4 万条,8 个 worker 的 CPU 一直在 90% 以上,普通任务的平均等待时间从 2 秒涨到 6 分钟。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,任务配置了 autoretry_for 但没给 max_retries,默认无限次,每次退避只有 1 秒,失败越快重投越快。重试消息和正常消息排在同一个队列,worker 取到的几乎全是失败任务。

这次卡住的地方就在「任务无限重试」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

处理上按这个顺序:给重试加 max_retries 和 max_retry_delay 明确最多 5 次 上限 10 分钟;重试消息投到单独队列 用不同的 worker 消费;超过次数直接进死信 不再回主队列;观察队列长度 确认恢复后 5 分钟内降到三位数。

改完只确认一件事:把下游改回 503 跑 10 分钟 主队列长度稳定在 200 以内 worker CPU 回到 30% 左右。

作者 9823189