.NET ヘルプ

.NET Core Polly(開発者向けの動作方法)

更新済み 7月 26, 2023
共有:

ポリー は、.NET レジリエンス戦略および一時的な障害処理ライブラリであり、開発者がリトライポリシー、サーキットブレーカー、タイムアウト、バルクヘッドアイソレーションポリシー、およびフォールバックなどのレジリエンスポリシーを表現できるようにします。 PollyはASP.NET Coreを対象としており、.NET Coreの回復力に欠かせないツールです。 Pollyはスレッドセーフな方法を持ち、複数の同時リクエストを成功裏に処理することができます。

このチュートリアルでは、一時的なフォールト処理に関する .NET ライブラリ Polly とその使用方法について詳しく説明します。 IronPDF ASP.NET Core アプリケーションで。 以下の各要素を深掘りし、ポリ回路ブレーカーパターンのメカニズムを説明し、バルクヘッド隔離とタイムアウトについて議論し、特定の例外や失敗したサービスを制御されたスレッドセーフな方法で対応する方法を紹介します。

ポリー方針

トランジエント障害は、アプリケーションがHTTPリクエスト、データベース、またはその他の外部リソースを介してWebサービスに接続しようとするときに頻繁に発生します。 これらの障害は、ネットワーク障害、一時的な接続問題、またはタイムアウトなどのように短時間で発生し、通常は短時間で自己修正されます。

Polly は、再試行ポリシー、高度なサーキットブレーカーポリシー、タイムアウトポリシー、フォールバックポリシー、およびバルクヘッド分離ポリシーのようなさまざまな戦略および明示的なポリシーを適用して、これらの一時的な故障を管理します。

リトライポリシー

リトライポリシーは、リトライロジックを使用して失敗した同時リクエストを自動的に再試行します。 これは、永遠に再試行するように設定したり、一定回数の自動再試行を行ったりすることが可能です。また、再試行の間に設定された時間間隔を待ったり、指数バックオフを使用することもできます。

サーキットブレーカー

サーキットブレーカーポリシーは、あらかじめ設定された失敗リクエストのしきい値を超えた後に特定のサービスを試みるためのキャンセレーショントークンをシステムがサポートするようにします。 サーキットブレーカー戦略は、カオスエンジニアリングや損傷を局所化するために船が防水扉を閉めるのに似ています。1つの障害が船全体を沈めることはありません。

タイムアウトポリシー

タイムアウトポリシーは、特定の.NETレジリエンスコードが実行できる最大時間を強制します。 それは、楽観的タイムアウトと悲観的タイムアウトの2つの形式で提供されます。

フォールバックポリシー

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

バルクヘッドアイソレーション

バルクヘッド隔離は、特定の操作に対して行われる同時リクエストの数を制限するために使用されます。これにより、ソケットの枯渇を防ぎ、制御された数の実行スロットを維持します。

キャッシュポリシー

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

ポリシーラップ

複数のポリシーをまとめて一つのユニットとして機能させることができます。

ポリシーの作成および構成

リトライポリシー

リトライポリシーはシンプルです: 特定の例外または障害が発生したときに、Pollyは基盤となるデリゲートを再度実行しようとします。 リトライ回数、リトライ間隔、または指数バックオフ戦略を設定できます。そうでなければ、無限にリトライし続けます。 Here's an example: 例があります。

//extension method
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
    });
//extension method
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
    });
'extension method
Dim retryPolicy = Policy.Handle(Of HttpRequestException)().WaitAndRetryAsync(3, Function(retryAttempt) TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), Sub(exception, timeSpan, retryCount, context)
End Sub)
VB   C#

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

サーキットブレーカーポリシーにより、Pollyライブラリは障害を監視し、指定された期間内に障害の数が設定されたしきい値を超えた場合、回路が「切断」され、その後の要求が指定された時間ブロックされます。これを「オープン」状態と呼びます。 この時間が経過すると、サーキットは「半開」状態に入り、特定のサービスの健全性を確認するためにいくつかのトラフィックを許可します。これらのリクエストが成功し、故障が発生しない場合、サーキットは閉じます。そうでない場合は再び開きます。

var circuitBreakerPolicy = Policy
    .Handle<HttpRequestException>()
    .CircuitBreakerAsync(5, TimeSpan.FromMinutes(1));
var circuitBreakerPolicy = Policy
    .Handle<HttpRequestException>()
    .CircuitBreakerAsync(5, TimeSpan.FromMinutes(1));
Dim circuitBreakerPolicy = Policy.Handle(Of HttpRequestException)().CircuitBreakerAsync(5, TimeSpan.FromMinutes(1))
VB   C#

タイムアウトポリシー

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

var timeoutPolicy = Policy.TimeoutAsync(30); // Optimistic timeout of 30 seconds
var timeoutPolicy = Policy.TimeoutAsync(30); // Optimistic timeout of 30 seconds
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

バルクヘッドアイソレーション

バルクヘッドアイソレーションは、特定のサービスに対する同時アクションの数を制限するために使用されます。これは、障害を隔離し、それが連鎖的に広がるのを防ぐ方法を提供します。 それはまた、依存関係にかかる負荷を制限します。

var bulkheadIsolationPolicy = Policy.BulkheadAsync(10, 20); // 10 concurrent actions, queue 20 additional actions
var bulkheadIsolationPolicy = Policy.BulkheadAsync(10, 20); // 10 concurrent actions, queue 20 additional actions
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

フォールバックポリシー

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

var fallbackPolicy = Policy
    .Handle<Exception>()
    .FallbackAsync<FallbackResult>(FallbackResult.SomethingWentWrong);
var fallbackPolicy = Policy
    .Handle<Exception>()
    .FallbackAsync<FallbackResult>(FallbackResult.SomethingWentWrong);
Dim fallbackPolicy = Policy.Handle(Of Exception)().FallbackAsync(Of FallbackResult)(FallbackResult.SomethingWentWrong)
VB   C#

ポリシーのラッピング

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

var policyWrap = Policy.WrapAsync(fallbackPolicy, retryPolicy, circuitBreakerPolicy, timeoutPolicy, bulkheadIsolationPolicy);
var policyWrap = Policy.WrapAsync(fallbackPolicy, retryPolicy, circuitBreakerPolicy, timeoutPolicy, bulkheadIsolationPolicy);
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

はじめに

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

Install-Package Polly
Install-Package IronPdf

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

IronPDF の目立った機能の一つは、その HTMLから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");
    }
}
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");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

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

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

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
VB   C#

PollyとIronPDFを使用して例を見てみましょう URL を PDF に変換する. 一時的な障害のために時折失敗するウェブサービスがあると仮定し、Pollyを使用してそれらの失敗を優雅に処理したいとします。

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

using System;
using System.Threading.Tasks;
using Polly;
using Polly.Wrap;
using IronPdf;
using System;
using System.Threading.Tasks;
using Polly;
using Polly.Wrap;
using IronPdf;
Imports System
Imports System.Threading.Tasks
Imports Polly
Imports Polly.Wrap
Imports IronPdf
VB   C#

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

var retryPolicy = Policy
    .Handle<Exception>()
    .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(2 * i));

var circuitBreakerPolicy = Policy
    .Handle<Exception>()
    .CircuitBreakerAsync(2, TimeSpan.FromSeconds(30));
var retryPolicy = Policy
    .Handle<Exception>()
    .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(2 * i));

var circuitBreakerPolicy = Policy
    .Handle<Exception>()
    .CircuitBreakerAsync(2, TimeSpan.FromSeconds(30));
Dim retryPolicy = Policy.Handle(Of Exception)().WaitAndRetryAsync(3, Function(i) TimeSpan.FromSeconds(2 * i))

Dim circuitBreakerPolicy = Policy.Handle(Of Exception)().CircuitBreakerAsync(2, TimeSpan.FromSeconds(30))
VB   C#

retryPolicyは、指数バックオフ戦略を使用して失敗したリクエストを最大3回再試行します。再試行の間隔は2秒、4秒、8秒です。 circuitBreakerPolicyは、30秒間の時間間隔内に2回連続で失敗が発生した場合に回路を開きます。

では、URL を PDF に変換する IronPDF コードを定義しましょう:

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

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

pdfBytes.SaveAs("output.pdf");
Dim htmlToPdf = New ChromePdfRenderer()
Dim pdfBytes = Await retryPolicy.WrapAsync(circuitBreakerPolicy).ExecuteAsync(Function()
		Console.WriteLine("Attempting to convert URL to PDF...")
' var result
		Dim result = htmlToPdf.RenderUrlAsPdfAsync("https://example.com")
		Console.WriteLine("Conversion successful!")
		Return result
End Function)

pdfBytes.SaveAs("output.pdf")
VB   C#

上記のサンプルコードでは、WrapAsync メソッドを使用して retryPolicycircuitBreakerPolicy をラップしています。 これにより、新しいリクエストに対して複数のポリシーを順次適用することができます。 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}");
    }
}
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}");
    }
}
Dim testUrls = { "https://ironpdf.com", "https://notexistingdomain.com/", "http://httpbin.org/delay/120" }

For Each url In testUrls
	Try
		Dim pdfBytes = Await retryPolicy.WrapAsync(circuitBreakerPolicy).ExecuteAsync(Function() htmlToPdf.RenderUrlAsPdfAsync(url))

		pdfBytes.SaveAs($"{Guid.NewGuid()}.pdf")
		Console.WriteLine($"Successfully converted {url} to PDF.")
	Catch ex As Exception
		Console.WriteLine($"Failed to convert {url} to PDF: {ex.Message}")
	End Try
Next url
VB   C#

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

.NET Core Polly(開発者向けの動作):図1 - URLをPDFに出力

結論

Pollyは、.NET Coreアプリケーションにおいてレジリエンスと一時的な障害処理を実装するための強力で柔軟なライブラリです。 再試行ポリシーやサーキットブレーカーのようなポリシーを組み合わせることで、開発者は失敗を適切に処理する堅牢で耐障害性のあるシステムを構築することができます。

このチュートリアルでは、Polly を使って URL を PDF に変換する方法を IronPDF と共に検証しました。 私たちは、リトライやサーキットブレーカーを含むPollyポリシーの定義と適用方法を学びました。 異なるURLでポリシーもテストしました。 また、以下についても対応可能です HTMLをPDFに変換.

IronPDFは 無料試用、ライセンスは $749 から始まり、プロジェクトでその機能を活用することができます。

< 以前
C# 文字列分割(開発者向けの使い方)
次へ >
Blazor vs MVC(開発者にとっての動作方法)

準備はできましたか? バージョン: 2024.9 新発売

無料のNuGetダウンロード 総ダウンロード数: 10,659,073 View Licenses >