实现带抖动的指数退避
您正在对接一个不稳定的第三方支付 API,偶尔会返回瞬时错误。为避免在服务本就吃紧时继续施压,您将实现一种重试策略:使用带完整抖动(full jitter)的指数退避,在每次尝试之间逐步增加等待时间,并加入随机性,避免大量客户端在同一时刻集中重试。
这里提供了一个 flaky_call(payload) 函数:它在前 3 次调用会因 TransientError 失败,第 4 次会成功。time、random 和 TransientError 已经加载。
本练习是课程的一部分
在 AWS 上开发应用
练习说明
- 在
try代码块内,用payload调用flaky_call,并返回其结果。 - 使用
base和当前的attempt计数计算本次尝试的指数上限(cap)。 - 通过
random.uniform()在0和cap之间随机取值,应用完整抖动。
交互式实操练习
通过完成这段示例代码来试试这个练习。
def retry_with_backoff(payload, max_attempts=5, base=0.2):
last_error = None
for attempt in range(max_attempts):
try:
# Try the call
return ____(payload)
except TransientError as err:
last_error = err
# Cap grows exponentially with each attempt
cap = ____ * (2 ** attempt)
# Pick a random wait between 0 and cap (full jitter)
wait = random.____(0, cap)
time.sleep(wait)
# All attempts failed; surface the last error
raise last_error
result = retry_with_backoff({"order_id": 42})
print(result)