始める無料で始める

ジッターを用いた指数バックオフの実装

断続的にエラーが発生する不安定なサードパーティの決済 API と連携しています。サービスが高負荷のときにリクエストを集中させないよう、フルジッター付き指数バックオフを使った再試行戦略を実装しましょう。再試行のたびに待機時間を増やしつつ、ランダム性を加えることで、複数のクライアントが同時に再試行するサンダリングハード問題を防ぎます。

flaky_call(payload) 関数が用意されています。この関数は最初の 3 回の呼び出しで TransientError を発生させ、4 回目に成功します。timerandom、および TransientError はすでに読み込まれています。

この演習はコースの一部です

AWS でのアプリケーション開発

コースを見る

演習の手順

  • try ブロック内で、payload を引数として flaky_call を呼び出し、その結果を返してください。
  • 現在の attempt 数と base を使って、この試行の指数的な上限(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)
コードを編集して実行