あるチームがDynamoDBのスロットリングを解決するため、指数バックオフを実装したリトライロジックをアプリケーションコードに追加した。しかし依然としてユーザーからエラーが報告されている。リトライロジックのコードを見ると、最大リトライ回数は5回、バックオフは固定1秒待機になっている。このリトライ戦略の問題点として最も重要なのはどれか。
- A. 固定1秒待機は「指数バックオフ」ではなく、かつジッター(ランダム性)がないため、複数クライアントが同時に1秒後にリトライしてスロットリングが悪化するサンダーリングハード問題が発生する
- B. AWS SDKには自動リトライ機能があるため、アプリケーション側のリトライロジックが二重になっている
- C. リトライ回数が5回は少なすぎる。10回以上にする必要がある
- D. DynamoDBのスロットリングはリトライで解決できないため、テーブルのキャパシティを増やすべきである
解答と解説を見る
正解: A
問題のリトライロジックは「指数バックオフを実装した」と言いながら実際は固定1秒待機であり、本来の指数バックオフ(1秒→2秒→4秒→8秒→16秒のように指数的に増加)になっていない(選択肢A)。さらにジッター(ランダムな揺らぎ)がないため、同時に多数のクライアントがスロットリングを受けた場合、全クライアントが同時に1秒後にリトライして再度スロットリングが発生するサンダーリングハード(Thundering Herd)問題が発生する。AWSが推奨する正しい指数バックオフは「min(cap, base * 2^attempt) + jitter」のように指数増加にランダムなジッターを加えたもの。選択肢Cのリトライ回数は重要ではあるが、根本的な問題は固定待機時間とジッターの欠如。選択肢DはDynamoDBのスロットリング解決にリトライは有効な手段の一つであり、正しくない。選択肢BのSDK自動リトライとの二重リトライは問題の可能性はあるが、今回の主な問題点ではない。