なぜ「指数バックオフユーティリティ」が業務で重要になるのか
業務システムで外部APIや外部DB、メッセージキュー、メールサーバなどにアクセスしていると、 「一時的に失敗する」「一瞬だけ不安定になる」という状況が必ずと言っていいほど発生します。
そのときに、ただ単純に「すぐリトライを繰り返す」だけだと、次のような問題が起きます。
- 外部サービスに短時間で大量のリクエストを送り、さらに負荷を悪化させてしまう
- 自システム側のスレッドやリソースを無駄に消費してしまう
- ネットワークや外部サービスが回復する前に、連続して失敗し続ける
これを防ぐために使われる代表的な戦略が 指数バックオフ(Exponential Backoff) です。
指数バックオフとは、 「リトライのたびに待機時間を指数的に増やしていく」 戦略のことです。
- 1回目の失敗後:1秒待つ
- 2回目の失敗後:2秒待つ
- 3回目の失敗後:4秒待つ
- 4回目の失敗後:8秒待つ
- …というように、待機時間を倍々に増やしていきます。
この戦略をユーティリティとして共通化しておくことで、 どのリトライ処理でも同じルールで「待機時間」を扱えるようになり、 外部サービスへの負荷を抑えつつ、システムの安定性を高めることができます。
ここから、プログラミング初心者向けにステップバイステップで、 実務で使える指数バックオフユーティリティを丁寧に解説していきます。
指数バックオフの基本発想を整理する
「試行回数に応じて待機時間を増やす」という考え方です
指数バックオフの基本は、とてもシンプルです。
- 1回目の失敗後は短く待つ
- 2回目の失敗後は少し長く待つ
- 3回目以降はさらに長く待つ
- 待機時間を倍々に増やしていく(例:1秒→2秒→4秒→8秒)
数式で表すと、次のようになります。
- 基本待機時間:
baseMillis(例:1000ms = 1秒) - 試行回数:
attempt(1回目=1, 2回目=2, …) - 待機時間:
baseMillis * 2^(attempt - 1)
例えば baseMillis = 1000 の場合:
- 1回目:
1000 * 2^(1-1) = 1000 * 1 = 1000ms - 2回目:
1000 * 2^(2-1) = 1000 * 2 = 2000ms - 3回目:
1000 * 2^(3-1) = 1000 * 4 = 4000ms
この「指数的に増やす」という考え方が、 外部サービスへの負荷を抑えつつ、回復を待つための基本戦略になります。
