Java Tips | 実務ユーティリティ:指数バックオフ

Java Java
スポンサーリンク
スポンサーリンク

なぜ「指数バックオフユーティリティ」が業務で重要になるのか

業務システムで外部APIや外部DB、メッセージキュー、メールサーバなどにアクセスしていると、 「一時的に失敗する」「一瞬だけ不安定になる」という状況が必ずと言っていいほど発生します。

そのときに、ただ単純に「すぐリトライを繰り返す」だけだと、次のような問題が起きます。

  • 外部サービスに短時間で大量のリクエストを送り、さらに負荷を悪化させてしまう
  • 自システム側のスレッドやリソースを無駄に消費してしまう
  • ネットワークや外部サービスが回復する前に、連続して失敗し続ける

これを防ぐために使われる代表的な戦略が 指数バックオフ(Exponential Backoff) です。

指数バックオフとは、 「リトライのたびに待機時間を指数的に増やしていく」 戦略のことです。

  • 1回目の失敗後:1秒待つ
  • 2回目の失敗後:2秒待つ
  • 3回目の失敗後:4秒待つ
  • 4回目の失敗後:8秒待つ
  • …というように、待機時間を倍々に増やしていきます。

この戦略をユーティリティとして共通化しておくことで、 どのリトライ処理でも同じルールで「待機時間」を扱えるようになり、 外部サービスへの負荷を抑えつつ、システムの安定性を高めることができます。

ここから、プログラミング初心者向けにステップバイステップで、 実務で使える指数バックオフユーティリティを丁寧に解説していきます。

指数バックオフの基本発想を整理する

「試行回数に応じて待機時間を増やす」という考え方です

指数バックオフの基本は、とてもシンプルです。

  1. 1回目の失敗後は短く待つ
  2. 2回目の失敗後は少し長く待つ
  3. 3回目以降はさらに長く待つ
  4. 待機時間を倍々に増やしていく(例: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

この「指数的に増やす」という考え方が、 外部サービスへの負荷を抑えつつ、回復を待つための基本戦略になります。

タイトルとURLをコピーしました