實作帶抖動的指數退避(exponential backoff with jitter)
你正在整合一個不太穩定的第三方金流 API,偶爾會回傳暫時性錯誤。為了避免在服務本就吃緊時持續施壓,你將實作一個重試策略,使用帶完整抖動的指數退避(exponential backoff with 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)