ヒント
このコンテンツは、.NET Docs で入手できる、またはオフラインで読み取ることができる無料のダウンロード可能な PDF として入手できる、コンテナー化された .NET アプリケーションの電子ブックである .NET マイクロサービス アーキテクチャからの抜粋です。
指数バックオフによる再試行には、オープンソースの Polly ライブラリなどのより高度な .NET ライブラリを利用することをお勧めします。
Polly は、回復性と一時的な障害処理機能を提供する .NET ライブラリです。 再試行、サーキット ブレーカー、バルクヘッド分離、タイムアウト、フォールバックなどの Polly ポリシーを適用することで、これらの機能を実装できます。 Polly は、.NET Framework 4.x と .NET Standard 1.0、1.1、2.0 (.NET Core 以降をサポート) を対象としています。
次の手順では、Polly を IHttpClientFactory
に統合して Http 再試行を使用する方法を示します。これについては、前のセクションで説明します。
.NET パッケージをインストールする
まず、 Microsoft.Extensions.Http.Polly
パッケージをインストールする必要があります。
- Visual Studio を使用したインストール
- dotnet CLI を使用したインストール
- nuget.exe CLI を使用したインストール
- パッケージ マネージャー コンソールを使用したインストール (PowerShell)
.NET 8 パッケージを参照する
IHttpClientFactory
は .NET Core 2.1 以降で使用できますが、プロジェクトでは NuGet の最新の .NET 8 パッケージを使用することをお勧めします。 通常は、拡張機能パッケージの Microsoft.Extensions.Http.Polly
も参照する必要があります。
アプリの起動時に Polly の再試行ポリシーを使用してクライアントを構成する
AddPolicyHandler() メソッドは、使用するHttpClient
オブジェクトにポリシーを追加します。 この場合、指数バックオフを含む HTTP 再試行に対して Polly のポリシーが追加されます。
次のコードに示すように、よりモジュール方式のアプローチを使用するには、 Program.cs ファイル内の別のメソッドで Http 再試行ポリシーを定義します。
static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
retryAttempt)));
}
前のセクションで示したように、標準の Program.cs アプリ構成で、名前付きまたは型指定されたクライアント HttpClient 構成を定義する必要があります。 次に、次のように、指数バックオフを使用して Http 再試行のポリシーを指定する増分コードを追加します。
// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
.SetHandlerLifetime(TimeSpan.FromMinutes(5)) //Set lifetime to five minutes
.AddPolicyHandler(GetRetryPolicy());
Polly を使用すると、再試行回数、指数バックオフ構成、エラーのログ記録などの HTTP 例外が発生したときに実行するアクションを含む再試行ポリシーを定義できます。 この場合、2 秒から始まる指数再試行で 6 回試行するようにポリシーが構成されます。
再試行ポリシーにジッター戦略を追加する
通常の再試行ポリシーは、コンカレンシーとスケーラビリティが高く、競合が多い場合にシステムに影響を与える可能性があります。 部分的な停止で多数のクライアントから発生する同様の再試行のピークを克服するには、再試行アルゴリズム/ポリシーにジッター戦略を追加することをお勧めします。 この戦略により、エンド ツー エンド システムの全体的なパフォーマンスを向上させることができます。 Polly で推奨されているように:ジッターによる再試行は、指数バックオフで適切に制御された中央値の初期再試行遅延で適用されるスムーズで均等に分散された再試行間隔によって、優れたジッター戦略を実装できます。 この方法は、問題が発生したときに突発的なピークを分散するのに役立ちます。 この原則を次の例に示します。
var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);
var retryPolicy = Policy
.Handle<FooException>()
.WaitAndRetryAsync(delay);
その他のリソース
再試行パターンhttps://learn.microsoft.com/azure/architecture/patterns/retry
Polly と IHttpClientFactoryhttps://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory
Polly (.NET の回復性と一時的な障害処理ライブラリ)https://github.com/App-vNext/Polly
Polly: ジッターを使用して再試行するhttps://github.com/App-vNext/Polly/wiki/Retry-with-jitter
マーク・ブルッカー。 ジッター:ランダム性で物事を改善する https://brooker.co.za/blog/2015/03/21/backoff.html
.NET