開始使用免費開始

實作帶抖動的指數退避(exponential backoff with jitter)

你正在整合一個不太穩定的第三方金流 API,偶爾會回傳暫時性錯誤。為了避免在服務本就吃緊時持續施壓,你將實作一個重試策略,使用帶完整抖動的指數退避(exponential backoff with full jitter):隨著重試次數拉長等待時間,同時加入隨機性,避免大量用戶端在同一時間點一窩蜂重試。

已提供 flaky_call(payload) 函式:前 3 次呼叫會以 TransientError 失敗,第 4 次會成功。timerandomTransientError 已經匯入。

本練習屬於課程

在 AWS 上開發應用程式

檢視課程

練習說明

  • try 區塊內,以 payload 呼叫 flaky_call,並回傳其結果。
  • 使用 base 與目前的 attempt 計數計算這次嘗試的指數上限(cap)。
  • 透過 random.uniform()0cap 之間取隨機等待時間,以套用完整抖動。

動手互動練習

試著完成這個範例程式碼,體驗一下這個練習。

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)
編輯並執行程式碼