重试与退避:失败之后怎么办
朴素重试(失败立刻重试)在大规模下会引发重试风暴和级联放大。正确策略四件套:指数退避(给下游恢复时间)+抖动(打破同步)+重试预算(限制总重试流量)+只重试瞬时故障且幂等的操作。再配熔断器兜底——重试失败到阈值就停止,别一直试一个挂掉的服务。重试不是"再试一次",是需要设计的工程。
朴素重试(失败立刻重试)在大规模下会引发重试风暴和级联放大。正确策略四件套:指数退避(给下游恢复时间)+抖动(打破同步)+重试预算(限制总重试流量)+只重试瞬时故障且幂等的操作。再配熔断器兜底——重试失败到阈值就停止,别一直试一个挂掉的服务。重试不是"再试一次",是需要设计的工程。
调用一个外部服务失败了,第一反应是再试一次。这个直觉没错,但「再试一次」从一句代码到生产可用的重试策略,中间隔着好几层坑——每一层都是被上一层的代价逼出来的。 起点:固定次数重试 最直觉的做法:失败就重试,重试 N 次,还不行就放弃。 for i in range(3): try: return c