リトライとバックオフ りとらいとばっくおふ
簡単に言うとこんな感じ!
通信が失敗したときに「もう一回試してみる」のがリトライ、「少し待ってから試す」のがバックオフだよ!混んでいるお店に電話して話し中だったとき、すぐ何度もかけ直すのではなく、少し時間を空けて再度かけるのと同じ感覚なんだ!
リトライとバックオフとは
リトライ(Retry)とは、通信やAPIの呼び出しが一時的なエラーで失敗したときに、処理を再試行する仕組みのことです。ネットワークの瞬断やサーバーの一時的な高負荷など、「すぐに直る可能性が高い失敗」に対して有効な手段で、システムの堅牢性(こわれにくさ)を高める基本テクニックです。
一方、**バックオフ(Backoff)とは、リトライの際に「次に試すまでの待ち時間」を設ける戦略です。特に指数バックオフ(Exponential Backoff)**と呼ばれる手法がよく使われ、再試行のたびに待ち時間を2倍・4倍・8倍…と指数関数的に延ばしていきます。失敗が続いているサーバーにひっきりなしにリクエストを送り続けると、回復の邪魔をしてしまうため、徐々に間隔を空けることで相手の回復を助けるわけです。
実務では「APIの呼び出し失敗時に自動で3回までリトライする。ただし1回目は1秒後、2回目は2秒後、3回目は4秒後に試す」というように、リトライとバックオフをセットで設計します。これはクラウドサービス連携・マイクロサービス・バッチ処理など、あらゆる「外部との通信」が発生する場面で欠かせない設計パターンです。
リトライ・バックオフの仕組みと種類
リトライの基本フロー
リクエスト送信
↓
成功? ─── Yes ──→ 処理完了 ✅
↓
No(エラー)
↓
リトライ可能なエラー? ─── No ──→ エラー終了 ❌(例: 404 Not Found)
↓
Yes(例: 503 Service Unavailable)
↓
待機(バックオフ)
↓
再試行回数 ≤ 上限? ─── No ──→ エラー終了 ❌
↓
Yes
↓
リクエスト再送信(繰り返し)
バックオフの種類
| 種類 | 概要 | 特徴 |
|---|---|---|
| 固定バックオフ | 毎回同じ間隔で待つ(例: 常に2秒後) | シンプルだが高負荷時に集中しやすい |
| 指数バックオフ | 待機時間を2倍ずつ増やす(1秒→2秒→4秒→8秒…) | 最も広く使われる標準的な手法 |
| ジッター付き指数バックオフ | 指数バックオフにランダムなゆらぎ(ジッター)を加える | 複数クライアントの同時集中を防げる |
| 線形バックオフ | 一定量ずつ増やす(1秒→2秒→3秒→4秒…) | 指数より緩やかで予測しやすい |
サブトピック1: 覚え方
「リトライはもう一回、バックオフは少し引いて待つ」と覚えましょう。英語の “back off” はまさに「一歩引く」という意味。相手が忙しそうなときに少し引いて待つ、という日常の礼儀と同じイメージです。
サブトピック2: ジッターとは
**ジッター(Jitter)とは「ランダムなゆらぎ」のことです。たとえば100台のクライアントが同時に障害を検知して全員が「4秒後にリトライ」すると、4秒後に一斉にリクエストが殺到します。これをサンダーリングハード問題(Thundering Herd)**と呼びます。ジッターを加えると待機時間がバラけるため、リクエストが分散されてサーバーへの集中攻撃を防ぐことができます。
歴史と背景
- 1980年代: イーサネットの衝突制御方式「CSMA/CD」で指数バックオフが採用される。ネットワーク通信における再送制御の原型
- 1990年代: TCPの再送タイムアウトにも指数バックオフが組み込まれ、インターネットの基盤技術として定着
- 2000年代前半: SOAPやWeb API普及とともに、アプリケーション層でのリトライ設計が重要に
- 2010年代: AWSやGCPなどクラウドAPIが普及し、APIのレートリミット(呼び出し回数制限)への対応としてリトライ+バックオフが必須の設計パターンとして広く認識される
- 2015年前後: Googleがクラウドサービスのベストプラクティスとしてジッター付き指数バックオフを公式推奨し、業界標準として定着
- 2020年代: マイクロサービスアーキテクチャの普及により、サービス間通信の信頼性確保としてリトライポリシーが設計必須要素に
関連する概念・設計との比較
リトライすべきエラーとすべきでないエラー
リトライ設計で重要なのは「このエラーはリトライして意味があるか」の判断です。
| HTTPステータスコード | エラー種別 | リトライ推奨 | 理由 |
|---|---|---|---|
| 408 Request Timeout | タイムアウト | ✅ | 一時的な遅延の可能性 |
| 429 Too Many Requests | レートリミット超過 | ✅ | 時間を空ければ解消 |
| 500 Internal Server Error | サーバー内部エラー | ✅ | 一時的な障害の可能性 |
| 502 Bad Gateway | ゲートウェイエラー | ✅ | 上流サーバーの一時障害 |
| 503 Service Unavailable | サービス一時停止 | ✅ | メンテナンス中など |
| 400 Bad Request | リクエスト不正 | ❌ | 何度試しても失敗する |
| 401 Unauthorized | 認証エラー | ❌ | 認証情報が間違っている |
| 404 Not Found | リソース不在 | ❌ | 存在しないものは何度でも見つからない |
冪等性(べきとうせい)との関係
冪等性(Idempotency)とは「同じ操作を何度繰り返しても結果が変わらない性質」のことです。リトライを安全に行うためには、この冪等性が非常に重要です。
冪等性のない操作(注文・決済など)をリトライすると、同じ処理が二重・三重に実行される危険があります。これを防ぐために冪等キー(Idempotency Key)という仕組みが使われます。リクエストに一意なIDを付与しておくと、サーバー側が「このIDのリクエストはすでに処理済み」と判断して重複実行を防いでくれます。
サーキットブレーカーとの使い分け
| パターン | 役割 | 使いどころ |
|---|---|---|
| リトライ+バックオフ | 一時的な失敗から自動回復する | 短時間で直りそうなエラー |
| サーキットブレーカー | 連続失敗時にリクエスト自体を止める | 障害が長引いている場合に無駄なリトライを防ぐ |
2つは組み合わせて使うのが理想です。「まずリトライで自動回復を試み、一定回数を超えたらサーキットブレーカーが働いて呼び出しを遮断する」という設計がクラウドネイティブアプリケーションの標準パターンです。
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 9110 | HTTP Semantics。503レスポンスの Retry-After ヘッダーの定義を含む |
| RFC 6585 | 429 Too Many Requestsステータスコードの定義 |
| RFC 7807 | Problem Details for HTTP APIs。エラー応答の標準フォーマット |
関連用語
- APIゲートウェイ — APIの入口となる中継サーバー。リトライポリシーを一元管理できる
- サーキットブレーカー — 連続失敗時にリクエストを遮断する障害対策パターン
- 冪等性 — 同じ操作を繰り返しても結果が変わらない性質。リトライ安全設計に必須
- レートリミット — APIの呼び出し回数制限。429エラーの原因となる
- マイクロサービス — サービス間通信が多発するためリトライ設計が特に重要なアーキテクチャ
- タイムアウト — 処理待ちの上限時間。リトライとセットで設計する
- 非同期処理 — メッセージキューを使うことでリトライをより安全に実装できる
- 障害対策・フォールトトレランス — システムが障害に耐えて動き続ける設計思想