import requests
requests.post(url, json=body, timeout=(1, 3))
# 熔断:连续 10 次失败后 60 秒内直接返回

短信服务商故障那天,下单接口 P99 从 300ms 涨到 32 秒,超时率 40%。日志显示卡在 sendSms 调用,连接超时设的是默认值 0,等于不限。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:发短信是同步调用,没有设连接和读取超时,三方不返回就一直等。下单主流程把它当成必须成功的步骤,失败就不往下走。没有熔断,故障期间每个请求都在等。

这次卡住的地方就在「短信接口降级」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:给三方调用设连接 1 秒 读取 3 秒的超时;短信发送移出主流程 改成异步事件;加熔断 连续失败十次就跳过发送;失败记录落库 恢复后补发。

确认没问题再收工,三方故障时下单 P99 稳定在 500ms 以内,短信失败记录能在恢复后补发成功。

作者 9823189