私はいくつかのマイクロサービスをより回復力のあるものにしようと試みており、特定のタイプのHTTPリクエストを再試行することはそれを助けるでしょう。
タイムアウトを再試行すると、クライアントの動作が著しく遅くなるため、この場合は再試行するつもりはありません。不正なリクエストは数ミリ秒後も不正なリクエストのままであるため、400を再試行しても効果はありません。
他のいくつかのタイプのエラーを再試行しない理由は他にもあると思いますが、どのエラーが発生し、その理由は何ですか?
永続的なように見えるため、再試行すべきではないエラーがいくつかあります。
したがって、4 **クライアントエラーのほとんどは再試行すべきではありません。
再試行してはならない5 **サーバーエラー:
ただし、マイクロサービスの回復力を高めるには、 サーキットブレーカー パターンを使用し、アップストリームがダウンしているときにすばやく失敗するようにします。
4xxコードは、呼び出し側でエラーが発生したことを意味します。不正なURL、不正な認証資格情報、または不正なリクエストであることを示す何かが考えられます。したがって、その問題を修正せずに、再試行を使用することはできません。エラーは呼び出し元のドメインにあり、呼び出し元はそれ自体が修正されることを期待する代わりに修正する必要があります。
例外があります。サービスが再デプロイまたは再起動されているとしましょう。そのインスタンスでは、エンドポイントが登録されていないため、4xx httpコードを送信します。ただし、しばらくすると、サーバーが使用可能になる場合があります。したがって、再試行は有益に思えるかもしれません。
より深い分析は、サービスが再起動されたとき、停止を防ぐためにローリング再起動であることを示します。したがって、前の議論はもはや成り立たない。ただし、環境/エコシステムがこの慣例に従っていない場合、クライアント側から報告されたエラー(4xxコード)が前述の理由により再試行する価値があると思われる場合は、再試行することを選択できます。しかし、成熟したシステムでは、メリットが認識されず、フェイルファスト機能が失われるため、これは行われません。
5xxエラーコードはサービスエラーであるため、再試行する必要があります。短期的(スレッドのオーバーフロー、依存サービスによる接続拒否)または長期的(システム障害、依存システムの停止、インフラストラクチャの利用不可)の可能性があります。これが永続的であるか一時的であるかに関係なく、サービスは情報(多くの場合ヘッダー)で応答します。時には再試行する時間に関する時間パラメータ。これらのパラメーターに基づいて、呼び出し元は再試行するかどうかを選択できます。
1xx、2xx、および3xxコードは、明白な理由で再試行する必要はありません。