重试预算:次数、等待和请求超时要一起算
每次请求超时后重试三次,整体耗时可能远超用户愿意等待的时间。重试策略需要受总截止时间约束。
问题从哪里出现
每次请求超时后重试三次,整体耗时可能远超用户愿意等待的时间。重试策略需要受总截止时间约束。
理解核心机制
先计算每次尝试预算与退避等待之和,再决定允许的最大尝试次数。下面只做时间账本,不真的等待或调用远程服务。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。数字与样本均为教学演示,不代表真实模型或服务器的测量结果。
deadline = 10.0
attempt_timeout = 2.0
backoffs = [0.5, 1.0, 2.0]
used, attempts = 0.0, 0
for attempt in range(4):
delay = 0 if attempt == 0 else backoffs[attempt - 1]
if used + delay + attempt_timeout > deadline:
break
used += delay + attempt_timeout
attempts += 1
assert used <= deadline and attempts == 3
print(attempts, used)适用边界与常见误区
真实实现应使用单调时钟,并考虑取消、Retry-After 和抖动。只有适合重试的错误才重试,有副作用请求需要幂等机制,防止重复执行。
继续练习
把总预算减少到五秒,比较固定单次超时与按剩余时间动态分配;再区分限流、认证失败和暂时网络故障。