再試行ポリシー
バックオフを設けて一時的な障害から再試行します。
「再試行ポリシー」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
Polly とは
Pollyは、アプリが一時的な障害、応答の遅延、依存先の過負荷に対処できるようにする .NET のレジリエンスライブラリです。再試行、サーキットブレーカー、タイムアウト、フォールバック、レート制限などの戦略を提供します。
このコースでは Polly v8(Polly.Core API)を使用します。
dotnet add package Polly.Coreなぜ再試行するのか
多くの障害は一時的なものです。短時間のネットワーク障害、一時的なタイムアウト、サービスの再起動などが該当します。少し時間を置いて操作を再試行すれば、ユーザーに気付かせることなく成功する場合がよくあります。
再試行は一時的なエラーだけを対象にし、404 のような恒久的なエラーには決して適用しないでください。
基本的な再試行戦略
Polly v8 では、RetryStrategyOptionsを使ってResiliencePipelineを構築します。デフォルトでは、スローされた例外によって再試行が実行されます。
using Polly;
using Polly.Retry;
var pipeline = new ResiliencePipelineBuilder()
.AddRetry(new RetryStrategyOptions
{
MaxRetryAttempts = 3
})
.Build();パイプラインを介した実行
リスクのある呼び出しをExecuteAsyncでラップします。Polly が呼び出しを実行し、例外がスローされた場合は、設定された回数まで再試行します。
await pipeline.ExecuteAsync(async token =>
{
await httpClient.GetAsync("https://api.example.com/data", token);
});再試行対象の決定
述語ビルダーとShouldHandleを使って、特定の例外や結果に対してだけ再試行し、恒久的なエラーに対する再試行を避けます。
new RetryStrategyOptions<HttpResponseMessage>
{
ShouldHandle = new PredicateBuilder<HttpResponseMessage>()
.Handle<HttpRequestException>()
.HandleResult(r => r.StatusCode == HttpStatusCode.ServiceUnavailable),
MaxRetryAttempts = 3
};固定バックオフと指数バックオフ
すぐに再試行すると、障害が発生しているサービスに過剰な負荷をかける可能性があります。バックオフによって試行の間隔を空けられます。Polly では、BackoffType設定により、固定、線形、指数のバックオフを利用できます。
指数バックオフ
指数バックオフでは、試行のたびに遅延時間を倍にします(例:2秒、4秒、8秒)。BackoffType.Exponentialと基準となるDelayを設定します。
new RetryStrategyOptions
{
MaxRetryAttempts = 4,
BackoffType = DelayBackoffType.Exponential,
Delay = TimeSpan.FromSeconds(2)
};ジッターの追加
多数のクライアントが同じスケジュールで再試行すると、同期した負荷の急増(「thundering herd」)が発生します。ジッターによって遅延時間にランダム性を加えられます。UseJitter = trueを有効にしてください。
new RetryStrategyOptions
{
MaxRetryAttempts = 4,
BackoffType = DelayBackoffType.Exponential,
Delay = TimeSpan.FromSeconds(1),
UseJitter = true
};各再試行への対応
OnRetryコールバックを使うと、試行をログに記録したり、メトリクスを出力したりできます。再試行の試行番号と、その再試行を引き起こした失敗が渡されます。
new RetryStrategyOptions
{
MaxRetryAttempts = 3,
OnRetry = args =>
{
Console.WriteLine($"Retry {args.AttemptNumber} after {args.RetryDelay}");
return default;
}
};再試行時間の合計を制限する
制限のない再試行では、ユーザーを長時間待たせる可能性があります。再試行をタイムアウト戦略(後で説明します)と組み合わせるか、試行回数に上限を設定して、復旧の見込みが低い場合は操作を早く失敗させます。
HttpClient での再試行
HTTP 呼び出しでは、HttpClientにレジリエンスハンドラーを登録すると、すべてのリクエストに再試行を自動的に適用できます。
builder.Services.AddHttpClient("api")
.AddResilienceHandler("retry", pipeline =>
{
pipeline.AddRetry(new HttpRetryStrategyOptions
{
MaxRetryAttempts = 3,
BackoffType = DelayBackoffType.Exponential
});
});確認テスト
再試行についての理解度をテストします。
まとめ
再試行ポリシーは、操作を再度実行することで一時的な障害に対処します。Polly v8 では、AddRetryでパイプラインを構築し、ShouldHandleで対象を限定し、BackoffType.ExponentialとUseJitterを使って試行間隔を空けます。OnRetryで試行を監視し、レジリエンスハンドラーを登録してすべてのHttpClient呼び出しを保護します。
よくある質問
「再試行ポリシー」レッスンは無料ですか?
はい。「再試行ポリシー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「再試行ポリシー」で何を学びますか?
バックオフを設けて一時的な障害から再試行します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「再試行ポリシー」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。