第8章. フォールト・トレランス
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
この章では、マイクロサービスアーキテクチャで失敗を受け入れる必要がある理由を学ぶ。 このようなことが起こる理由の1つは、マイクロサービスアーキテクチャが機能するためにネットワークに大きく依存しており、ネットワークは常に利用できるとは限らない重要な部分だからだ(ネットワークのダウン、ワイヤの飽和、トポロジーの変更、下流サービスの更新など)。
このため、どのような種類の問題に対してもフォールトトレラントで、エラーをただ伝播させるのではなく、グレースフル・ソリューションを提供するサービスを構築することが重要である。
この章では、以下のタスクのレシピを紹介する:
-
さまざまなレジリエンス戦略を実装する
-
エラーが発生した場合のフォールバック・ロジックを用意する。
-
フォールトトレランスパラメータを正しく設定する
8.1 自動再試行の実装
問題
エラーが発生した場合、失敗からの回復を試みるために自動再試行を実行したい。
解決策
MicroProfile Fault Tolerance 仕様は、CDI Bean や MicroProfile REST Client を含む任意の CDI 要素に自動再試行を実装する方法を提供する。
障害から保護し、最悪の場合、障害の代わりにデフォルトのロジックを提供するために、いくつかの戦略を実装することができる。 例えば、読者の好みに応じて本を提案するサービスがあるとする。 このサービスがダウンした場合、障害の代わりに、ベストセラーの本のリストをキャッシュすることで、少なくとも障害を起こさずにリストを提供することができる。 つまり、フォールトトレランス戦略として定義する重要な部分の1つは、復旧が不可能な場合に実行するフォールバック・ロジックである。
MicroProfile Fault Toleranceは、コードをフォールトトレラントにするためのいくつかの戦略に焦点を当てている。 自動再試行を実行するという単純な最初の戦略を見てみよう。
MicroProfile Fault Tolerance 仕様を使用するための拡張機能を追加する必要がある:
./mvnw quarkus:add-extension -Dextensions="quarkus-smallrye-fault-tolerance"
ネットワーク障害から回復する最も簡単で、時に最も効果的な方法の1つは、同じ演算子を再試行することである。 断続的なエラーであれば、何度か再試行すればエラーは直るだろう。
@org.eclipse.microprofile.faulttolerance.Retry でアノテーションされたクラスやメソッドは、例外がスローされた場合に自動再試行を実行する。最大再試行回数、最大継続時間、ジッターなど、さまざまなparameters を設定したり、再試行が実行されるべき例外の種類を指定したりできる。
さらに、メソッドに@org.eclipse.microprofile.faulttolerance.Fallback のアノテーションを付けることで、フォールバック・ロジックを実装することができる。フォールバックとして実行するロジックは、org.eclipse.microprofile.faulttolerance.FallbackHandler インタフェースを実装したクラスとして実装することができる: ...