メインコンテンツまでスキップ

验证与重试请求

概述

即使正确发送,服务器 API 请求也可能失败。诸如流量峰值、短暂中断、网络问题或上游服务缓慢之类的临时性问题都可能阻止成功响应。这些错误通常持续时间较短,且往往会自行解决。

遇到此类错误时立即失败会降低可靠性,而过于频繁地重试则可能使服务器过载。指数重试通过拉开重试尝试的间隔、每次增加延迟来解决这一问题。这给服务器留出恢复时间,提高成功几率,从而带来更稳定可靠的集成。


如何实现指数重试

本节定义了实现指数重试机制所预期的客户端行为

步骤 1:正常发送请求

  • 执行一次 API 请求
  • 在首次尝试时不施加任何延迟

步骤 2:评估失败类型

如果请求失败,客户端必须确定:

  • 是否收到了 HTTP 响应?
  • 如果是,HTTP 状态代码是什么?
  • 如果否,是否发生了网络或传输错误?

此分类决定了是否允许重试。


步骤 3:判断错误是否可重试

仅当以下所有条件均为真时才重试:

  • 该失败被视为_瞬时性_的
  • 稍后重试同一请求可能会成功
  • 该请求可安全重试(幂等或受保护)

如果其中任何一个条件为假,则该请求必须失败,且不应尝试任何重试策略。


步骤 4:在重试前应用指数退避

当允许重试时:

  • 在重试前等待
  • 每次尝试时以指数方式增加等待时间

延迟必须:

  • 从较小值开始(例如:500ms)
  • 逐步增加(例如:每次请求翻倍)
  • 设有合理的最大上限(例如:最多 10 分钟)

时间线示例

尝试次数延迟
1500 ms
21 s
32 s
44 s
58 s

步骤 5:限制重试

重试策略应定义一个限制,以避免无限请求从而使服务器 API 过载。一旦达到该限制:

  • 停止重试
  • 向调用方暴露错误

错误代码与重试策略

本节根据 HTTP 请求的错误类型,定义了何时应触发或不应触发指数重试

类别使用指数退避重试
网络错误✅ 是
408 Request Timeout✅ 是
429 Too Many Requests✅ 是
460 Client Timeout✅ 是
5xx Server Errors✅ 是
1xx Informational Responses❌ 否
2xx Successful responses❌ 否
4xx Client Errors (400, 401, 403, 404, 409, 422)❌ 否

其他未定义的错误类型应单独识别,以提高所发出请求的成功率。


给 API 使用者的最后说明

  • 重试逻辑必须是确定性的且有界限的
  • 服务器提供的重试提示始终优先
  • 不正确的重试可能比不重试更有害

遵循这些规则可确保与服务器 API 实现可预测、安全且可扩展的集成。