核心要点

  • 先分类错误:429/5xx/网络超时是可重试,400/参数错/内容审核拒绝是不可重试,别盲目重试

  • 设合理超时 + 对可重试错误做指数退避重试(base 1s、最多 3 次、带随机抖动),并保证调用幂等

  • 加并发控制与限流排队(令牌桶/信号量),触发熔断后降级:切小模型、读缓存、返回兜底文案

  • 全链路监控错误率与 P95 延迟,异常告警,避免静默失败

标准回答

第一步:把错误分好类

对照状态码处理:429(限流)、500/502/503(服务端)、连接超时这类是「可重试」;400(参数错)、401(鉴权)、内容审核拒绝是「不可重试」,重试只会浪费配额,应直接报错或走人审。

第二步:超时 + 退避重试

每次请求设合理超时(如 30s,流式可更长),对可重试错误用指数退避:第 1 次等 1s、第 2 次 2s、第 3 次 4s,加随机抖动避免同时重试打爆服务。重试前确认请求幂等(带 request_id),防止重复扣费或重复写库。

第三步:限流、降级、熔断

本地用令牌桶或信号量控制并发,超额的请求排队而不是一起打过去。连续失败触发熔断,期间走降级路径:切到更小/更快的模型、命中缓存、或返回预设兜底文案。

第四步:监控兜底

记录每次请求的模型、token、延迟、错误码,看错误率和 P95,异常实时告警,留 badcase 复盘。

常见误区

⚠️ 常见踩坑

对 400 参数错或内容审核拒绝也盲目重试,白白消耗配额还拖慢响应;重试不做幂等,导致同一笔请求重复扣费或重复落库。

追问

追问 1指数退避为什么要加随机抖动(jitter)?

如果大量请求同时失败、又用同样的退避间隔,它们会在同一时刻一起重试,形成「重试风暴」再次打垮服务。加随机抖动让各请求错峰重试,削平瞬时峰值。

追问 2熔断和限流有什么区别?

限流是主动控制发出去的请求速率(令牌桶/排队),防止自己把上游打爆;熔断是被动保护,监测到错误率过高时直接快速失败、停止打无用请求一段时间,给上游恢复时间,期间走降级路径,超时后再半开试探恢复。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。