一个上游 500 牵出的四个 bug 与一场部署事故
来源:dev.to — 2026-10-21 · 约 7 分钟阅读
📋 概述
一条简历解析失败的告警,作者本以为加重试就能收工,结果两天里连修四个问题:任务把所有异常都当成终态,一次上游 500 就永久废掉一份简历;Gemini 其实根本不读 Word 文件,却用 500 掩盖了本该返回的 400,于是重试只是白试三遍;加依赖后部署把生产机冻结,只能从控制台重启;换了本地解析方案又踩到新坑。文章按顺序复盘每处修复,重点在把瞬态错误与永久错误分开。
🔑 核心要点
- 所有异常都终态化,等于让一次几秒就会恢复的上游故障永久失败一份文件。
- 重试必须按错误码区分,而 except 的书写顺序会吞掉 celery 的 Retry 异常。
- 上游不支持的格式被包装成 500,于是「瞬态故障」的假设从一开始就是错的。
- 重试三次仍失败属于服务不可用,应记录为告警而非错误,真正的 bug 才进错误队列。
💡 金句
“If Gemini is still down after three retries, that's an outage, not a bug.”
译:如果重试三次 Gemini 还没恢复,那是服务故障,不是 bug。
← 返回 dev.to 首页