アプリケーションの回復性を実装する

完了

.NET の回復性機能は Polly プロジェクトに基づいて構築され、 Microsoft.Extensionsを通じて利用できます。 1 行のコードをアプリに追加することで、適切な既定値を使用する標準的な回復性戦略を追加できます。

アプリに回復性を追加する

マイクロサービス アーキテクチャを使用して構築されたアプリに回復性を追加し、個々のサービス間で HTTP 要求を使用するには、次の手順を実行します。

  1. Microsoft.Extensions.Http.Resilience パッケージをプロジェクトに追加します。
  2. HttpClient サービス呼び出しに回復性ハンドラーを追加します。
  3. 回復性戦略を構成します。

NuGet パッケージをプロジェクトに追加する

次のコマンドを実行して、回復性 NuGet パッケージを追加します。

dotnet add package Microsoft.Extensions.Http.Resilience

アプリ プロジェクト フォルダーのターミナルからこのコマンドを実行すると、パッケージ参照がプロジェクト ファイルに追加されます。

次に、アプリケーションのスタートアップ クラスに次の using ステートメントを追加します。

using Microsoft.Extensions.Http.Resilience;

回復性戦略を追加する

HttpClient サービスに標準の回復性戦略を追加できるようになりました。 さまざまな戦略を組み合わせた、すぐに使える構成が .NET により提供されています。

標準の回復性ハンドラーに含まれる戦略を示す図。全体的なタイムアウト、再試行、バルクヘッド、サーキット ブレーカー、試行タイムアウトなど。

要求ハンドラーは、次の各戦略を左から右の順に順に実行します。

  • 要求タイムアウトの合計戦略: 要求が実行できる合計時間を設定します。 これは、他のすべての戦略の上限を設定していると考えることができます。
  • 再試行戦略: この戦略では、再試行回数、バックオフ数、ジッター数のオプションを制御します。 これらのオプションは、前の戦略で設定された合計タイムアウトを超えることはできません。
  • サーキット ブレーカー戦略: この方法では、障害率がしきい値を超えた場合に回線が開きます。
  • 試行タイムアウト戦略: この戦略では、個々の要求ごとにタイムアウトが設定されます。 要求にこの時間より長くかかる場合は、例外がスローされます。

この拡張メソッドを追加することで、すべての既定値でこの標準戦略を追加できます。

.AddStandardResilienceHandler();

たとえば、 WebApplicationを宣言していて、HttpClient サービスに回復性戦略を追加する場合は、次のコードを使用します。

builder.Services.AddHttpClient<ServiceBeingCalled>(httpClient =>
{
    httpClient.BaseAddress = new Uri("https://service.endpoint/");
}).AddStandardResilienceHandler();

前のコードの最初の行は、HTTPClient に標準の回復性ハンドラーを追加します。 これにより、再試行およびサーキットブレーカーの戦略における全てのデフォルト設定が使用されます。

回復性戦略を構成する

次のような新しいオプションを指定することで、任意の戦略の既定値を変更できます。

.AddStandardResilienceHandler( options => 
{  
    options.RetryOptions.RetryCount = 10;
    options.RetryOptions.BaseDelay = TimeSpan.FromSeconds(1);
});

このコードは、再試行戦略の既定値を 10 回のリタイアの最大数に変更し、線形バックオフを使用し、基本遅延として 1 秒を使用します。

選択するオプションは、相互に互換性がある必要があります。 たとえば、合計時間が既定値の 30 秒のままである場合、再試行オプションによって例外が発生します。 指数バックオフ設定により、合計時間が 10 回の再試行を完了する 2,046 秒になるため、これはエラーです。 これはランタイム例外であり、コンパイル時エラーではありません。

次の表に、各戦略で使用できるオプションを示します。

合計要求タイムアウトのオプション 説明
TotalTimeout 要求に要する合計時間。 既定値は 30 秒です。
OnTimeout 要求がタイムアウトしたときに呼び出されるコールバック関数。既定値は null です。

再試行オプション 説明
リトライ回数 最大再試行回数。 デフォルトは3です。
BackoffType 使用するバックオフの種類。 線形と指数のどちらかを選択できます。 既定値は指数関数です。
UseJitter バックオフにジッターを追加するかどうか。 ジッターは遅延にランダム性を追加し、負荷の急増を減らすのに役立ちます。 既定値は true です。
BaseDelay 再試行の間の遅延。 既定値は 2 秒です。

サーキット ブレーカーのオプション 説明
休憩時間 サーキットブレークの継続時間。 既定値は 5 秒です。
故障率 回線を開く成功した要求に対する失敗した要求の比率。 既定値は 0.1 です。
サンプリング時間 故障率が計算される時間の長さ。 既定値は 30 秒です。
OnClosed 回線が閉じられたときに呼び出されるコールバック関数。 既定値は null です。
オンハーフオープンド 回線が半分開いているときに呼び出されるコールバック関数。 既定値は null です。
OnOpened 回線を開いたときに呼び出されるコールバック関数。 既定値は null です。

試行タイムアウトのオプション 説明
Timeout 要求に要する時間。 既定値は 2 秒です。
OnTimeout 要求がタイムアウトしたときに呼び出されるコールバック関数。既定値は null です。

回復性戦略を使用したアプリケーション内のイベントのフローを示すシーケンス図。

シーケンス図は、標準の回復性戦略で各戦略がどのように連携するかを示しています。 まず、合計タイムアウト戦略が、要求にかかる時間の制限要因を制御します。 その後、再試行戦略は、合計タイムアウト内に完了する再試行の最大数を設定する必要があります。 故障率が設定されたしきい値を超えると、サーキット ブレーカー戦略によって回路が開きます。 試行タイムアウト戦略では、個々の要求ごとにタイムアウトが設定されます。 要求にこの時間より長くかかる場合は、例外がスローされます。