ジッターを用いた指数バックオフの実装
断続的にエラーが発生する不安定なサードパーティの決済 API と連携しています。サービスが高負荷のときにリクエストを集中させないよう、フルジッター付き指数バックオフを使った再試行戦略を実装しましょう。再試行のたびに待機時間を増やしつつ、ランダム性を加えることで、複数のクライアントが同時に再試行するサンダリングハード問題を防ぎます。
flaky_call(payload) 関数が用意されています。この関数は最初の 3 回の呼び出しで TransientError を発生させ、4 回目に成功します。time、random、および 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)