Bamba news

Pollyとは?.NETの回復性ライブラリを徹底解説【初心者向け】

.NET開発者必見!Pollyライブラリを使えば、リトライやサーキットブレーカーなどの回復性パターンを簡単に実装できます。本記事では、Pollyの基本的な使い方からHttpClientFactoryとの連携、高度な戦略まで、コード例を交えてわかりやすく解説します。

Tags:#開発

はじめに

現代のソフトウェア開発、特にマイクロサービスやクラウドベースのアプリケーションでは、外部サービスとの通信が不可欠です。しかし、ネットワークは常に安定しているわけではありません。一時的な接続エラー、サーバーの一時的な高負荷、APIの応答遅延など、予測不能な「一時的な障害(Transient Fault)」は日常的に発生します。

このような障害が発生した際に、アプリケーションが何も対策をしていなければ、即座にエラーとなり、ユーザー体験を損なうだけでなく、システム全体の不安定化を招く可能性があります。

そこで登場するのが、.NETの世界で絶大な信頼を得ているライブラリ「Polly」です。Pollyは、こうした一時的な障害に対して、アプリケーションをより堅牢に、そして「回復性(Resilience)」を持たせるための強力なツールキットです。

この記事では、Pollyがどのようなライブラリで、どのように使うのかを、具体的なコード例を交えながら、初心者の方にも分かりやすく解説していきます。

Pollyとは? - .NETのための「転ばぬ先の杖」

Pollyは、.NET向けの回復性および一時的な障害を処理するためのライブラリです。 fluent API(流れるようにメソッドを繋げて記述できるスタイル)とスレッドセーフな設計が特徴で、アプリケーションの信頼性を高めるための様々な「ポリシー」を簡単に組み込むことができます。

ここで言う「ポリシー」とは、「もしこんな問題が起きたら、こう対処する」というルールの集まりです。Pollyは、以下のような強力なポリシーを提供します。

  • リトライ (Retry): 失敗した操作を、少し時間を置いてから再度試行します。
  • サーキットブレーカー (Circuit Breaker): 失敗が何度も続く場合に、一時的にその操作へのリクエストを遮断し、障害の連鎖を防ぎます。
  • タイムアウト (Timeout): 処理が一定時間内に完了しない場合に、処理を中断させます。
  • フォールバック (Fallback): 操作が最終的に失敗した場合に、あらかじめ用意しておいた代替の処理や値を返します。
  • レートリミッター (Rate Limiter): 一定時間内に実行できるリクエストの数を制限します。
  • バルクヘッド分離 (Bulkhead Isolation): システムの一部で発生した障害が、他の部分へ波及するのを防ぎます。
  • ヘッジング (Hedging): 複数の候補に対して同時にリクエストを送り、最初に成功した結果を採用します。

これらのポリシーを組み合わせることで、単純なリトライ処理から、複雑で高度な障害対策まで、柔軟に実装することが可能です。

Pollyを始めてみよう - インストールと基本的な使い方

インストール

Pollyをプロジェクトに追加するのは非常に簡単です。NuGetパッケージマネージャーを使用します。

Pollyにはいくつかのバージョンがありますが、モダンなv8の構文を利用する場合は Polly.Core を、従来のAPIとの互換性が必要な場合は Polly をインストールします。

ここでは、最新の Polly.Core を使用する例を紹介します。以下のコマンドをターミナルで実行してください。

dotnet add package Polly.Core

基本的な使い方:リトライポリシーの実装

Pollyで最もよく使われるのが「リトライ」ポリシーです。例えば、外部APIを呼び出す際に、一時的なネットワークエラーで失敗したとします。一度の失敗で諦めるのではなく、少し時間をおいて再度試行すれば、成功する可能性は十分にあります。

この「少し時間をおいて再度試行する」処理を、Pollyは非常に簡単に記述させてくれます。特に「指数関数的バックオフ (Exponential Backoff)」という戦略がよく用いられます。これは、リトライの度に待ち時間を指数関数的に(例: 2秒、4秒、8秒…)増やしていく方法で、障害からの回復時間をサーバーに与える効果があります。

以下は、HttpRequestException が発生した場合、またはHTTPステータスコードが成功でない場合に、3回まで指数関数的バックオフでリトライするコード例です。

// v7以前のPollyの構文例です。基本的な考え方はv8でも同様です。
var retryPolicy = Policy
    // HttpRequestException が発生した場合にポリシーを適用
    .Handle<HttpRequestException>()
    // または、HttpResponseMessage の結果が成功ステータスコードでなかった場合に適用
    .OrResult<HttpResponseMessage>(response => !response.IsSuccessStatusCode)
    // リトライの戦略を定義
    .WaitAndRetryAsync(
        3, // 最大3回までリトライ
        retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), // 待機時間: 1回目は2^1=2秒, 2回目は2^2=4秒, 3回目は2^3=8秒
        onRetry: (outcome, timespan, retryCount, context) =>
        {
            // リトライ時にログを出力するなどの処理
            Console.WriteLine($"リトライ回数: {retryCount}。待機時間: {timespan.TotalSeconds}秒。");
        }
    );

// ポリシーを使って非同期処理を実行
HttpResponseMessage httpResponse = await retryPolicy.ExecuteAsync(() => 
    httpClient.GetAsync("https://example.com/api/data")
);

このコードだけで、堅牢なリトライ処理が実装できてしまいます。自分で try-catchTask.Delay を駆使して複雑なループを書く必要はありません。

ASP.NET Coreとの連携 - HttpClientFactoryでPollyをもっと賢く

ASP.NET Coreアプリケーションでは、HttpClientFactory と Pollyを連携させることで、さらに強力かつ効率的にHTTPリクエストの回復性を高めることができます。

.NET 8の標準的な回復性ハンドラ

.NET 8からは、この連携がさらに簡単になりました。Microsoft.Extensions.Http.Resilience パッケージを追加することで、標準的な回復性戦略を一行で追加できます。

// Program.cs や Startup.cs での設定
// まず、必要なパッケージをインストールします: dotnet add package Microsoft.Extensions.Http.Resilience

builder.Services.AddHttpClient("MyApiClient")
    // この一行だけで、標準的な回復性ポリシーが適用される!
    .AddStandardResilienceHandler();

AddStandardResilienceHandler() は、以下のような複数のポリシーを良きに計らって組み合わせたパイプラインを自動で設定してくれます。

  1. レートリミッター (過剰なリクエストを防ぐ)
  2. タイムアウト (全体的な処理時間を制限)
  3. リトライ (指数関数的バックオフ付き)
  4. サーキットブレーカー (連続する障害から保護)
  5. タイムアウト (個々の試行に対するタイムアウト)

これにより、開発者は複雑な設定を意識することなく、業界のベストプラクティスに基づいた堅牢なHTTPクライアントを簡単に手に入れることができます。

より高度な回復性戦略

Pollyの真価は、リトライ以外の高度な戦略にもあります。

サーキットブレーカー (Circuit Breaker)

電気回路のブレーカーを想像してください。過電流が流れるとブレーカーが落ちて回路を保護するように、サーキットブレーカーポリシーは、**短期間に失敗が連続した場合に、それ以降のリクエストを一時的に遮断(Open状態)**します。

これにより、障害が発生しているサービスに対して無駄なリクエストを送り続けて負荷をかけることを防ぎ、システム全体を保護します。一定時間が経過すると、リクエストを少しだけ通してみて(Half-Open状態)、成功すれば回路を元に戻し(Close状態)、失敗すれば再び遮断します。

フォールバック (Fallback)

リトライやサーキットブレーカーを駆使しても、最終的に操作が失敗してしまうこともあります。そんな時の「最後の砦」がフォールバックです。

フォールバックポリシーは、操作が失敗したときに、あらかじめ定義しておいた代替の値や処理を実行します。例えば、APIから最新のデータを取得できなかった場合に、キャッシュしておいた古いデータを返す、あるいは「現在サービスを利用できません」という固定のメッセージを返す、といった使い方が考えられます。これにより、アプリケーションが完全に停止することを防ぎ、ユーザーに対して何らかの応答を返すことができます。

ジッター (Jitter)

指数関数的バックオフは優れた戦略ですが、一つ課題があります。もし多数のクライアントがまったく同じタイミングで障害に遭遇した場合、それらが同じバックオフ間隔で一斉にリトライを試みてしまい、サーバーに再び瞬間的な高負荷をかける「リトライストーム」を引き起こす可能性があります。

この問題を解決するのが「ジッター」です。ジッターは、バックオフの待機時間にランダムな「揺らぎ」を加える技術です。例えば、「8秒待つ」のではなく「8秒±1秒のランダムな時間待つ」ようにすることで、各クライアントのリトライタイミングを分散させ、サーバーへの負荷を平準化します。Pollyでは、このジッター付きのバックオフ戦略も簡単に実装できます。

まとめ

Pollyは、.NETアプリケーション開発において、もはや必須とも言えるライブラリです。一時的な障害は避けられないという前提に立ち、それらにしなやかに対応する「回復性」をアプリケーションに与えてくれます。

  • 簡単な導入: dotnet add package コマンド一つで始められます。
  • 直感的なAPI: fluent APIにより、どのようなポリシーを適用するかがコード上で明確になります。
  • 強力な連携: HttpClientFactory や .NET 8 の AddStandardResilienceHandler() と組み合わせることで、ベストプラクティスに基づいた障害対策を簡単に実装できます。
  • 柔軟な戦略: 単純なリトライから、サーキットブレーカーやフォールバックなどを組み合わせた高度なレジリエンスパイプラインまで、要件に応じて構築可能です。

もしあなたのアプリケーションが外部サービスと通信を行っているのであれば、ぜひPollyの導入を検討してみてください。それは、あなたのアプリケーションをより安定させ、信頼性を高め、そして何よりも、予期せぬ障害からあなたのサービスとユーザーを守るための、非常に賢明な投資となるでしょう。

関連する記事

Difyとは?AIアプリ開発を誰でも簡単に。仕組みや使い方をやさしく解説

プログラミング不要でAIアプリが作れると話題の「Dify」。この記事では、Difyとは何か、その仕組みや料金、具体的な使い方、ビジネスでの活用事例まで、専門用語を避けてわかりやすく解説します。AI開発の第一歩を踏み出したい方におすすめです。

Azure AI Foundryとは?Azure OpenAIモデルをビジネスに活かす方法を徹底解説

Azure AI Foundry(旧Azure AI Studio)で、GPT-4oなどのAzure OpenAIモデルをどう使うの?この記事では、専門用語を避け、AIモデルの準備から具体的な活用事例まで、誰にでも分かるようにやさしく解説します。ビジネスにAIを取り入れたい方必見です。

Amazon Lexとは?Alexaの技術で誰でも簡単にチャットボットが作れるAWSのサービスを徹底解説

Amazon Lexは、Alexaと同じ技術を使った対話AI(チャットボット)開発サービスです。プログラミングの知識が少なくても、音声やテキストで対話するボットを簡単に作成できます。本記事では、その仕組み、特徴、料金体系、活用事例まで、初心者にも分かりやすく解説します。

AWS IoT Coreとは?仕組みから活用例まで、初心者にもわかりやすく解説

「IoTを始めたいけど、何から手をつけていいかわからない…」そんな方へ。AWS IoT Coreは、IoTデバイスとクラウドを安全かつ簡単につなぐためのサービスです。この記事では、AWS IoT Coreの基本的な仕組みから、具体的な活用例、気になる料金体系まで、専門用語を避けて丁寧に解説します。

AWS IoT TwinMakerとは?デジタルツインを誰でも簡単に実現する仕組みを解説

「デジタルツインって何?」「AWS IoT TwinMakerで何ができるの?」そんな疑問を解決します。この記事では、現実世界のモノを仮想空間に再現するデジタルツインの概念と、それを実現するAWS IoT TwinMakerの仕組み、活用事例を専門用語なしで分かりやすく丁寧に解説します。

Bamba news