IRONSOFTWAREHOME
開発者向けアップデート

.NET Core Polly (開発者向けの仕組み)

Jacob Mellor、Ironチームの最高技術責任者(CTO)
Jacob Mellor
Updated: 2025年7月28日

Pollyは、開発者がリトライポリシー、サーキットブレーカ、タイムアウト、バルクヘッド分離ポリシー、フォールバックなどのレジリエンスポリシーを表現できる.NETのレジリエンス戦略と一時的なフォルトハンドリングライブラリです。 PollyはASP.NET Coreを対象としており、.NET Coreのレジリエンスに不可欠なツールです。 Pollyはスレッドセーフで、複数の同時要求を成功した応答で処理することをサポートしています。

このチュートリアルでは、一時的なフォルトハンドリング for .NETライブラリであるPollyについて、ASP.NET CoreアプリケーションでIronPDFと共に使用する方法について詳しく説明します。 Pollyの各側面を詳しく調べ、サーキットブレーカパターンの仕組みを説明し、バルクヘッド分離とタイムアウトを議論し、特定の例外や失敗するサービスを、制御されたスレッドセーフな方法で失敗応答と共に処理する方法を示します。

Pollyのポリシー

一時的なフォルトは、アプリケーションがHTTPリクエスト、データベース、またはその他の外部リソースを通じてWebサービスに接続しようとする際に頻繁に発生します。 これらのフォルトは、ネットワーク障害、ネットワーク接続の一時的な問題、またはタイムアウトなど、短時間で自然治癒することが一般的です。

Pollyは、リトライポリシー、高度なサーキットブレーカポリシー、タイムアウトポリシー、フォールバックポリシー、およびバルクヘッド分離ポリシーなどの異なる戦略を適用して、これらの一時的なフォルトを管理します。

リトライポリシー

リトライポリシーは、リトライロジックを使って失敗した同時要求を自動的に再試行します。 無限に再試行するように設定したり、一定回数の自動再試行を行ったり、リトライ間に一定のインターバルを待つか、指数関数的バックオフを利用することができます。

サーキットブレーカ

サーキットブレーカポリシーは、設定された失敗要求の閾値を超えた後に特定のサービスを試みるためのキャンセルトークンをサポートします。 サーキットブレーカ戦略は、カオスエンジニアリングや船が損傷を局所化するために防水扉を閉めることに類似しており、1つのフォルトでは船全体を沈めません。

タイムアウトポリシー

タイムアウトポリシーは、.NETレジリエンスコードの特定の部分が実行できる最大時間を強制します。 楽観的タイムアウトと悲観的タイムアウトという2つの方法があります。

フォールバックポリシー

フォールバックポリシーは、障害が発生した場合に代用の値または動作を提供するために使用されます。 このポリシーは、障害が発生したサービスがプロセス全体を停止させるべきではない場合に有用です。

バルクヘッド分離

バルクヘッド分離は特定の操作に対して同時に実行できる要求の数を制限し、ソケット枯渇の可能性を制限し、制御された数の実行スロットを維持します。

キャッシュポリシー

キャッシュポリシーは、同じ実行が再び呼び出された場合に分散キャッシュ値を返すことができるように、実行の成功応答をキャッシュします。

ポリシーラップ

複数のポリシーを1つのユニットとして機能させるためにそれらをまとめてラップすることができます。

ポリシーの作成と設定

リトライポリシー

リトライポリシーは簡単です。特定の例外またはフォルトが発生すると、Pollyは基礎となるデリゲートを再実行しようとします。 リトライ回数、リトライ間のインターバル、または指数関数的バックオフ戦略を定義できます。そうしないと永遠にリトライします。 以下は例です:

// Retry policy for handling HttpRequestException with exponential back-off
var retryPolicy = Policy
    .Handle<HttpRequestException>()
    .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), 
    (exception, timeSpan, retryCount, context) =>
    {
        // This is the OnRetry delegate, where you can log or monitor failed requests
        Console.WriteLine($"Retry {retryCount} after {timeSpan}. Exception: {exception.Message}");
    });

サーキットブレーカポリシー

サーキットブレーカポリシーは、指定された期間内に設定された閾値を超えると、サーキットを"開く"状態にし、その時間中は更なる要求をブロックします。これを"オープン"状態と呼びます。 この時間の後、サーキットは "ハーフオープン" 状態になり、特定のサービスの健康状態を確認するために一部のトラフィックを許可します。これらの要求が成功し、フォルトが発生しない場合、サーキットは閉じます; それ以外の場合、再度開きます。

// Circuit breaker policy to handle failing requests with open and half-open states
var circuitBreakerPolicy = Policy
    .Handle<HttpRequestException>()
    .CircuitBreakerAsync(5, TimeSpan.FromMinutes(1));

タイムアウトポリシー

タイムアウトポリシーは、サービスが適切な時間内に応答しないシナリオを処理します。 Pollyは2種類のタイムアウトを提供します: 楽観的と悲観的。 楽観的タイムアウトは別々のスレッドで動作し、CancellationToken を介して基礎となる操作をキャンセルします。 悲観的タイムアウトは、操作が完了するか、タイムアウト期間が経過するまで親スレッドをブロックします。

// Timeout policy with a 30-second optimistic timeout
var timeoutPolicy = Policy.TimeoutAsync(30); // 30 seconds

バルクヘッド分離

バルクヘッド分離は、特定のサービスに対して同時に行えるアクションの数を制限するために使用されます。これはフォルトを隔離し、カスケードすることを防ぐ方法を提供します。 また、依存関係に置く負荷を制限します。

// Bulkhead isolation policy to limit concurrency and queue length
var bulkheadIsolationPolicy = Policy.BulkheadAsync(10, 20); // 10 concurrent actions, 20 queue slots

フォールバックポリシー

フォールバックポリシーは、すべてが失敗した場合にデフォルトの動作や代替値を提供する必要がある場合に役立ちます。

// Fallback policy to provide a default result on failure
var fallbackPolicy = Policy
    .Handle<Exception>()
    .FallbackAsync<FallbackResult>(
        FallbackResult.SomethingWentWrong, 
        (exception, context) => 
        {
            Console.WriteLine($"Fallback triggered due to: {exception.Message}");
            return Task.CompletedTask;
        });

ポリシーのラップ

複数のポリシーは PolicyWrap を使って柔軟に組み合わせることができます。

// Combining multiple policies using PolicyWrap
var policyWrap = Policy.WrapAsync(fallbackPolicy, retryPolicy, circuitBreakerPolicy, timeoutPolicy, bulkheadIsolationPolicy);

開始方法

PollyをIronPDFと一緒に使用するには、Visual Studioをインストールし、.NET Coreの新しいコンソールアプリケーションプロジェクトを作成してください。 Visual Studio の NuGet パッケージ マネージャー コンソールを開き、PollyIronPDF パッケージをインストールします。

PM > Install-Package Polly

PM > Install-Package IronPdf

Pollyを使ってIronPDFでURLをPDFに変換する

IronPDFの目立つ機能はそのHTML to PDF機能で、レイアウトとスタイルを維持します。 この機能はウェブコンテンツをPDFに変換し、報告書や請求書、文書化にも適しています。 HTMLファイル、URL、HTML文字列をPDFに変換することができます。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}

PollyとIronPDFを使用してURLをPDFに変換する例を見てみましょう。 一時的なフォルトにより時折失敗するWebサービスがあり、それらの失敗をPollyを使用して円滑に処理したいと仮定します。

まず最初に、必要な名前空間を Program.cs ファイルにインポートしましょう。

using System;
using System.Threading.Tasks;
using Polly;
using Polly.Wrap;
using IronPdf;

次に、ポリシーを定義します。 この例では、失敗を処理するためにリトライポリシーとサーキットブレーカポリシーの組み合わせを使用します:

// Retry policy with exponential backoff
var retryPolicy = Policy
    .Handle<Exception>()
    .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(2 * i));

// Circuit breaker policy to block requests after consecutive failures
var circuitBreakerPolicy = Policy
    .Handle<Exception>()
    .CircuitBreakerAsync(2, TimeSpan.FromSeconds(30));

retryPolicy は失敗したリクエストを最大で3回再試行し、指数バックオフ戦略を用いて再試行間で2秒、4秒、および8秒待機します。 2回連続で失敗した場合、30秒の時間間隔内であれば circuitBreakerPolicy は回路を開きます。

次にURLをPDFに変換するためのIronPDFコードを定義します:

var htmlToPdf = new ChromePdfRenderer();
var pdfBytes = await retryPolicy
    .WrapAsync(circuitBreakerPolicy)
    .ExecuteAsync(async () =>
    {
        Console.WriteLine("Attempting to convert URL to PDF...");
        var result = await htmlToPdf.RenderUrlAsPdfAsync("https://example.com");
        Console.WriteLine("Conversion successful!");
        return result;
    });

pdfBytes.SaveAs("output.pdf");

上記のサンプルコードでは、retryPolicycircuitBreakerPolicyWrapAsync メソッドでラップしています。 これにより、新しいリクエストに複数のポリシーを順次適用することができます。 ExecuteAsync メソッドは提供されたデリゲートを実行し、このコードでは IronPDF の RenderUrlAsPdfAsync メソッドです。

Pollyポリシーを適用することで、コードが一時的なフォルトにレジリエントであることを保証します。 リクエストが失敗した場合、Pollyはリトライポリシーに従って自動的に再試行します。 連続した失敗数が事前設定された閾値を超えた場合、サーキットブレーカポリシーがサーキットを開き、指定された期間中の更なるリクエストを防ぎます。

Pollyポリシーのテストケース

Pollyポリシーの効果をテストするため、いくつかの失敗したリクエストをシミュレートします。 存在しないエンドポイントにURLを変更し、いくつかのテストケースを追加します:

var testUrls = new[]
{
    "https://ironpdf.com",
    "https://notexistingdomain.com/",
    "http://httpbin.org/delay/120"
};

foreach (var url in testUrls)
{
    try
    {
        var pdfBytes = await retryPolicy
            .WrapAsync(circuitBreakerPolicy)
            .ExecuteAsync(() => htmlToPdf.RenderUrlAsPdfAsync(url));

        pdfBytes.SaveAs($"{Guid.NewGuid()}.pdf");
        Console.WriteLine($"Successfully converted {url} to PDF.");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Failed to convert {url} to PDF: {ex.Message}");
    }
}

上記のコードでは、一連のテストURLを繰り返し、それらの各々をPDFに変換しようとします。 リクエストが失敗した場合、例外がキャッチされ、コンソールに適切なメッセージが表示されます。

.NET Core Polly (開発者にとっての動作方法): 図1 - URLからPDFへの出力

結論

Pollyは.NET Coreアプリケーションでレジリエンスと一時的なフォルトのハンドリングを実装するためのパワフルで柔軟なライブラリです。 リトライやサーキットブレーカといったポリシーを組み合わせることで、開発者は事態に優雅に失敗を処理するための堅牢で故障に耐性のあるシステムを構築できます。

このチュートリアルでは、Pollyを使ってIronPDFでURLをPDFに変換する方法を探りました。 リトライとサーキットブレーカを含むPollyポリシーの定義と適用方法を学びました。 異なるURLでポリシーのテストも行いました。 HTMLをPDFに変換する場合にも同様に行えます。

IronPDFは無料トライアルを提供しており、ライセンスは競争力のある価格でスタートし、プロジェクトにその能力を活用することができます。

Jacob Mellor、Ironチームの最高技術責任者(CTO)
最高技術責任者(CTO)

ジェイコブ・メラーはIron Softwareの最高技術責任者(CTO)であり、C# PDFテクノロジーを開拓する先見的なエンジニアです。Iron Softwareのコアコードベースを支えるオリジナル開発者として、彼は創業以来、会社の製品アーキテクチャを形成し、CEOのCameron Rimingtonとともに、会社をNASA、Tesla、および世界的な政府機関にサービスを提供する50人以上の会社に変えました。1999年にロンドンで最初のソフトウェアビジネスを開業し、2005年に最初 for .NETコンポーネントを作成した後、Microsoftのエコシステム全体で複雑な問題を解決することを専門としました。

関連する記事

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
無料のライブデモを予約する
Booking Badge

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。