技術解説 · 出典付きの回答

指数バックオフによる再試行

指数バックオフによる再試行とは、失敗した処理を再試行する間隔を指数関数的に延ばしていくエラー処理の戦略です。一定の間隔で再試行するのではなく、失敗するたびに待ち時間を長くすることで、受信サーバーが輻輳や一時的な障害から回復する時間を確保します。

仕組み

処理は1秒などの初期待ち時間から始まります。最初の再試行が失敗すると、待ち時間に一定の係数(通常は2)を掛けます。2回目の再試行は2秒後、3回目は4秒後、4回目は8秒後というように続きます。この等比的な増加は、遅延の最大しきい値または最大試行回数に達するまで続き、その時点でメッセージは恒久的な失敗として扱われます。

送信者にとっての重要性

この方法を使うことで、送信者が意図せず受信側のメールサーバーにサービス拒否(DoS)攻撃を仕掛けてしまうことを防げます。数千通のメッセージが同時に失敗し、そのすべてが10秒ごとに再試行すると、トラフィックの急増によって受信側がオフラインのままになりかねません。再試行を分散させることで、送信者はより良いレピュテーションを保ち、メッセージが破棄される前に一時的な4xxのSMTPエラーが解消される可能性を高められます。

運用上の考慮事項

この戦略に欠かせない追加要素がジッターで、遅延に少量のランダムなばらつきを加えるものです。ジッターがないと、同時に失敗した複数のリクエストが同期した波のように一斉に再試行し、トラフィックの急増を生みます。ジッターを実装すれば、再試行が時間枠全体に均等に分散され、インフラへの負荷をさらに減らせます。

実装でよくある間違い

開発者は、再試行回数の上限や遅延の上限を設定し忘れることがよくあります。上限がないと待ち時間が数時間から数日にまで延び、トランザクションメールでは許容できない遅延になります。もう1つの間違いは、5xxの恒久的な失敗を再試行可能として扱うことです。指数バックオフを適用するのは、レート制限や一時的なグレーリスティングなど、4xxの一時的なエラーに限るべきです。

具体例

APIで送信するトランザクションメールを考えてみましょう。試行1は421(サーバービジー)エラーで失敗します。システムは2秒待ちます。試行2も失敗し、システムは4秒待ちます。試行3も失敗し、システムは8秒待ちます。試行4の時点では受信サーバーのキューが解消されている可能性が高く、メールは受け付けられます。SendHQは https://sendhq.cc/tools で無料ツールを提供しており、メール基盤の効率的な管理に役立ちます。

よく寄せられる質問

固定バックオフと指数バックオフの違いは何ですか?

固定バックオフは、失敗回数に関係なくX秒ごとに再試行します。指数バックオフは、対象サーバーの負荷を減らすために、失敗するたびに間隔を延ばします。

再試行はいつやめるべきですか?

5xxの恒久的な失敗が返されたとき、最大試行回数に達したとき、または遅延の上限に達したときに再試行をやめるべきです。

ジッターは指数的な増加に影響しますか?

いいえ、ジッターは計算された指数的な遅延にランダムなオフセットを加えるもので、同時に発生した複数のリクエストが同期して再試行し、急増が起きるのを防ぎます。

一次情報源