レジリエンスパイプライン
複数の戦略をレジリエンスパイプラインに組み合わせます。
「レジリエンスパイプライン」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
戦略の組み合わせ
実際のレジリエンスでは、通常、複数の戦略を連携させる必要があります。Polly v8 では、ResiliencePipelineBuilderを使ってそれらを 1 つのレジリエンスパイプラインに組み合わせられます。
ResiliencePipelineBuilder
Add...の呼び出しをチェーンし、最後にBuild()を呼び出します。その結果、呼び出しの実行に繰り返し利用できる、スレッドセーフなResiliencePipelineが生成されます。
var pipeline = new ResiliencePipelineBuilder()
.AddRetry(new RetryStrategyOptions())
.AddTimeout(TimeSpan.FromSeconds(5))
.Build();順序が重要
戦略は外側から内側へ実行されます。最初に追加した戦略が残りの戦略をラップします。一般的で正しい順序は、試行ごとのタイムアウトを再試行の内側に置き、その周囲を全体タイムアウトとサーキットブレーカーで囲む構成です。
var pipeline = new ResiliencePipelineBuilder()
.AddTimeout(TimeSpan.FromSeconds(10)) // overall
.AddRetry(new RetryStrategyOptions())
.AddCircuitBreaker(new CircuitBreakerStrategyOptions())
.AddTimeout(TimeSpan.FromSeconds(2)) // per attempt
.Build();型付きパイプライン
フォールバックや結果ベースの再試行のように戦略で結果を検査する場合は、ジェネリックResiliencePipelineBuilder<T>を使って、パイプラインに戻り値の型を認識させます。
var pipeline = new ResiliencePipelineBuilder<HttpResponseMessage>()
.AddRetry(new HttpRetryStrategyOptions())
.Build();状態を指定した実行
クロージャーによる割り当てを避けるには、ExecuteAsyncに状態を渡します。Polly はその状態をコールバックに返します。
await pipeline.ExecuteAsync(
static async (state, token) => await state.CallAsync(token),
myService);ResiliencePipelineProvider
パイプラインをインラインで構築する代わりに、DI に名前付きパイプラインを登録し、ResiliencePipelineProviderを使って解決します。これにより設定を一元管理できます。
builder.Services.AddResiliencePipeline("db", pipeline =>
{
pipeline.AddRetry(new RetryStrategyOptions())
.AddTimeout(TimeSpan.FromSeconds(3));
});名前付きパイプラインの解決
ResiliencePipelineProvider<string>を注入し、必要な場所でキーを使ってパイプラインを取得します。
public class OrderService
{
private readonly ResiliencePipeline _pipeline;
public OrderService(ResiliencePipelineProvider<string> provider)
{
_pipeline = provider.GetPipeline("db");
}
}HttpClient のレジリエンス
AddResilienceHandler拡張メソッドは、型付きまたは名前付きのHttpClientにパイプラインを追加し、すべての送信リクエストに適用します。
builder.Services.AddHttpClient<CatalogClient>()
.AddResilienceHandler("catalog", b =>
{
b.AddRetry(new HttpRetryStrategyOptions());
b.AddCircuitBreaker(new HttpCircuitBreakerStrategyOptions());
});標準レジリエンスハンドラー
Microsoft は、推奨される順序で適切な再試行、サーキットブレーカー、タイムアウト、レート制限をまとめた、必要な機能が揃ったAddStandardResilienceHandlerを提供しています。
builder.Services.AddHttpClient<CatalogClient>()
.AddStandardResilienceHandler();パイプラインは再利用でき、構築コストも低い
パイプラインは 1 回構築して、多くの実行で再利用します。パイプラインは不変かつスレッドセーフなので、共有しても安全で効率的です。
可観測性フック
すべての戦略はコールバック(OnRetry、OnOpened、OnTimeout、OnFallback)を公開しており、Polly はテレメトリも出力します。これらをログやメトリクスに接続することで、完全な可視性を確保できます。
確認テスト
レジリエンスパイプラインをテストします。
まとめ
ResiliencePipelineBuilderは、再試行、サーキットブレーカー、タイムアウト、フォールバックを 1 つの再利用可能なパイプラインに組み合わせます。戦略は外側から内側へ実行されるため、順序が重要です。結果を扱う戦略にはジェネリックビルダーを使い、AddResiliencePipelineで名前付きパイプラインを登録し、ResiliencePipelineProviderで解決します。HTTP では、AddResilienceHandlerまたはAddStandardResilienceHandlerですべてのリクエストを保護できます。
よくある質問
「レジリエンスパイプライン」レッスンは無料ですか?
はい。「レジリエンスパイプライン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「レジリエンスパイプライン」で何を学びますか?
複数の戦略をレジリエンスパイプラインに組み合わせます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「レジリエンスパイプライン」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 再試行ポリシー
- サーキットブレーカーパターン
- タイムアウトとフォールバックのポリシー
- レジリエンスパイプライン