再試行パターン: 回復力のあるマイクロサービスの構築
マイクロサービス アーキテクチャでは、サービスはメモリ内呼び出しではなくネットワーク経由で通信します。この分離により、大規模な水平スケーリングと独立した展開が可能になりますが、ネットワークの信頼性が低いという重大な脆弱性も生じます。
ダウンストリーム サービスでは、いつでも、短時間のネットワーク障害、一時的な CPU スパイク、データベース ロックの急速な競合、ローリング アップデートの再起動が発生する可能性があります。これらの一時的な障害は 一時的な障害 として知られています。
ダウンストリーム呼び出しが失敗した瞬間にサービスがすぐにエラーをスローし、リクエストを失敗させると、脆弱なユーザー エクスペリエンスが作成されます。代わりに、これらの一時的なエラーの多くは、少し待ってから再試行することで自動的に解決できます。ここで 再試行パターン が役に立ちます。
このガイドでは、再試行パターン、内部でどのように動作するか、単純な実装の危険性、Java (Resilience4j) と Go で再試行パターンを正しく実装する方法について説明します。
現実世界のたとえ: 話し中の回線にリダイヤルする あなたが友人に電話しようとしていると想像してください。あなたは相手の番号にダイヤルしますが、相手は現在別の通話中であるため、話中信号を受け取ります。
あなたはすぐに諦めて連絡先を削除し、二度と話せないと思い込んでいませんか?もちろん違います。電話を切り、少し待ってから、もう一度相手の番号をダイヤルします。まだ通話中の場合は、5 分待ってからもう一度試してください。
最終的に通話は終了し、再試行は成功します。
マイクロサービスでは:
呼び出しは、ダウンストリーム サービスへの API リクエストです。 ビジー信号は、一時的なネットワーク エラーまたは 503 Service Unavailable 応答です。 リダイヤルは再試行です。 待機時間はバックオフ期間です。 危険: 単純な再試行と「再試行の嵐」 再試行メカニズムの実装は、一見すると簡単に思えます。HTTP 呼び出しを for ループでラップし、成功するまで試行し続けるだけです。ただし、単純な再試行の実装では、軽微な問題がシステム全体の壊滅的な停止に簡単に変化する可能性があります。
突然のトラフィックの急増に苦戦しているダウンストリーム サービスを想像してください。データベースは 99% の CPU 使用率で実行されており、リクエストがタイムアウトし始めています。
Microservices
Retry Pattern
Software Architecture
System Design
Fault Tolerance
Resilience