跳過到頁腳內容
.NET幫助

.NET Core Polly(開發者的工作原理)

Polly 是一個 .NET 的彈性策略和暫時性故障處理庫,允許開發人員表達彈性策略,如重試策略、斷路器、超時、隔艙隔離策略和回退。 Polly 針對 ASP.NET Core,使其成為 .NET Core 彈性的關鍵工具。 Polly 是線程安全的,並支持處理多個並發請求並獲得成功的響應。

本教程將提供有關暫時性故障處理 .NET 庫 Polly 以及如何在 ASP.NET Core 應用程式中與 IronPDF 一起使用的更多詳細資訊。 我們將深入探討 Polly 的每個方面,解釋斷路器模式的機理,討論隔艙隔離和超時,並展示如何以受控、線程安全的方式處理特定的異常或失敗服務。

Polly 策略

暫時性故障經常發生在您的應用程式嘗試通過 HTTP 請求、數據庫或其他外部資源連接到 web 服務時。 這些故障,例如網路故障、臨時連接問題或超時,通常很短暫,且通常在短時間內自行糾正。

Polly 通過應用不同的策略和表達策略來管理這些暫時性故障,如重試策略、高级斷路器策略、超時策略、回退策略和隔艙隔離策略。

重試策略

重試策略可以自動使用重試邏輯重試失敗的並發請求。 可以配置為永久重試或在某次次數自動重試,它可以在重試之間等待固定時間間隔或使用指數退避。

斷路器

斷路器策略讓您的系統支持取消令牌,以便在預配置的失敗請求閾值之後嘗試特定服務。 斷路器策略類似於混沌工程或船隻關閉水密門以局部損害:一個故障不會讓整個船沉沒。

超時策略

超時策略強制執行特定 .NET 彈性代碼可以執行的最大時間。 它有兩種風格:樂觀超時和悲觀超時。

回退策略

回退策略用於在出現故障時提供替代值或行為。 當失敗的服務不應停止整個過程時,這種策略可能有用。

隔艙隔離

隔艙隔離用於限制對特定操作可發出的並發請求數量,從而限制套接字耗盡的可能性並維持受控的執行插槽數量。

緩存策略

緩存策略可以緩存執行的成功響應,使得如果再次調用相同的執行,Polly 可以返回分佈式緩存值。

策略包裝

允許我們將多個策略捆綁在一起,使其可以作為一個單位工作。

創建和配置策略

重試策略

重試策略很簡單:當發生特定的異常或錯誤時,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}");
    });
// 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}");
    });
' Retry policy for handling HttpRequestException with exponential back-off
Dim retryPolicy = Policy.Handle(Of HttpRequestException)().WaitAndRetryAsync(3, Function(retryAttempt) TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), Sub(exception, timeSpan, retryCount, context)
	Console.WriteLine($"Retry {retryCount} after {timeSpan}. Exception: {exception.Message}")
End Sub)
$vbLabelText   $csharpLabel

斷路器 Policy

斷路器策略允許 Polly 庫監控故障,如果在指定期間內的故障數量超過配置的閾值,則電路將"跳閘",進一步的請求將被阻止指定時間,這被稱為"打開"狀態。 在此時間之後,電路進入"半開"狀態,允許一定流量檢查特定服務的健康狀況。如果這些請求成功且沒有故障,電路關閉; 否則,它會再次打開。

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

超時策略

超時策略處理服務在合理時間內未回應的情況。 Polly 提供兩種類型的超時:樂觀和悲觀。 樂觀超時在單獨的線程上工作,並通過 CancellationToken 取消底層操作。 悲觀超時在操作完成或超時期間過去之前,阻塞父線程。

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

隔艙隔離

隔艙隔離用於限制對特定服務的並發操作數量。它提供了一種隔離故障並防止其擴散的方法。 它也限制了我們對依賴關系的負載。

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

回退策略

當所有其他方式失敗時,回退政策是提供默認行為或替代值的有效辦法。

// 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;
        });
// 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;
        });
' Fallback policy to provide a default result on failure
Dim fallbackPolicy = Policy.Handle(Of Exception)().FallbackAsync(Of FallbackResult)(FallbackResult.SomethingWentWrong, Function(exception, context)
			Console.WriteLine($"Fallback triggered due to: {exception.Message}")
			Return Task.CompletedTask
End Function)
$vbLabelText   $csharpLabel

包裝策略

可以靈活地使用 PolicyWrap 組合多個策略:

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

入門指南

要開始使用 Polly 與 IronPDF,請確保您已安裝 Visual Studio 並在 .NET Core 中創建新的控制台應用程式專案。 在 Visual Studio 中打開 NuGet 套件管理器控制台並安裝 PollyIronPDF 套件:

Install-Package Polly
Install-Package IronPdf

使用 Polly 與 IronPDF 將 URL 轉換為 PDF

IronPDF 的一個突出功能是其 HTML 到 PDF 功能,確保佈局和樣式保持不變。 此功能將 Web 內容轉換為 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
$vbLabelText   $csharpLabel

讓我們通過一個例子來演示如何使用 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
$vbLabelText   $csharpLabel

接下來,我們將定義我們的策略。 在本例中,我們將使用重試和斷路器策略的結合來處理故障:

// 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));
// 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));
' Retry policy with exponential backoff
Dim retryPolicy = Policy.Handle(Of Exception)().WaitAndRetryAsync(3, Function(i) TimeSpan.FromSeconds(2 * i))

' Circuit breaker policy to block requests after consecutive failures
Dim circuitBreakerPolicy = Policy.Handle(Of Exception)().CircuitBreakerAsync(2, TimeSpan.FromSeconds(30))
$vbLabelText   $csharpLabel

retryPolicy 將使用指數退避策略重試失敗的請求最多三次,重試時間間隔為 2 秒、4 秒和 8 秒。 circuitBreakerPolicy 如果在 30 秒的時間間隔內發生兩次連續故障,將開啟電路。

現在,讓我們定義將 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");
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");
Dim htmlToPdf = New ChromePdfRenderer()
Dim pdfBytes = Await retryPolicy.WrapAsync(circuitBreakerPolicy).ExecuteAsync(Async Function()
		Console.WriteLine("Attempting to convert URL to PDF...")
		Dim result = Await htmlToPdf.RenderUrlAsPdfAsync("https://example.com")
		Console.WriteLine("Conversion successful!")
		Return result
End Function)

pdfBytes.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

在上面的示例代碼中,我們使用 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}");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

在上述代碼中,我們遍歷一組測試 URL 並嘗試將每一個轉換為 PDF。 如果請求失敗,將捕獲異常,並在控制台上顯示適當信息。

.NET Core Polly(它如何為開發人員工作): 圖 1 - URL 到 PDF 輸出

結論

Polly 是一個強大而靈活的庫,用於在 .NET Core 應用程式中實施彈性和暫時性故障處理。 通過結合重試和斷路器等策略,開發人員可以構建強健和容錯系統,優雅地處理故障。

在本教程中,我們探討了如何使用 Polly 與 IronPDF 將 URL 轉換為 PDF。 我們學習了如何定義和應用 Polly 策略,包括重試和斷路器。 我們還使用不同的 URL 測試了我們的政策。 我們也可以將其應用於 將 HTML 轉換為 PDF

IronPDF 提供免費試用,許可證以具競爭力的價格開始,允許您在項目中利用其功能。

常見問題解答

什麼是 Polly,它如何增強 .NET Core 的彈性?

Polly 是一個專為彈性和瞬態故障處理設計的 .NET 庫,特別適用於 ASP.NET Core 應用程序。它通過提供諸如重試、斷路器、超時、隔艙隔離和降級等策略來提高彈性,確保系統的穩健性和容錯能力。

我如何在 .NET Core 中使用 Polly 實現重試策略?

在 .NET Core 中,您可以使用 Polly 通過配置自動重試失敗的請求來實現重試策略。這可以通過設置重試次數和嘗試之間的時間間隔來完成,以有效管理瞬態故障。

斷路器策略如何防止 .NET 應用程序中的級聯故障?

Polly 中的斷路器策略通過監控故障並在到達故障閾值時打開電路阻止請求來防止級聯故障。這會阻止進一步的請求,直到電路重置,使系統在接受新請求之前能夠恢復。

隔艙隔離在管理資源耗盡方面起到什麼作用?

Polly 中的隔艙隔離限制服務的並發請求數量,通過控制執行槽位來防止資源耗盡。此策略有助於控制故障並確保 .NET Core 應用程序中的資源管理效率。

Polly 的超時策略如何提高應用程序的響應性?

Polly 的超時策略為操作執行設置最大時間,這有助於管理服務無法及時響應的場景。通過設置樂觀或悲觀超時,開發者可以確保應用程序始終保持響應。

是否可以使用 Polly 增強 URL 到 PDF 轉換的可靠性?

是的,Polly 可以通過將其重試和斷路器策略與 PDF 生成工具集成來增強 URL 到 PDF 轉換的可靠性。這確保了轉換過程對瞬態故障具有彈性,維持可靠性。

Polly 中的降級策略如何確保服務的優雅降級?

Polly 中的降級策略提供當服務失效時的替代響應或行為。這有助於確保一個故障不會導致整個應用程序停頓,允許優雅降級和持續運行。

您如何在 .NET 應用程序中結合多個 Polly 策略?

在 .NET 應用程序中,可以使用策略包裝來結合多個 Polly 策略。這允許開發者將不同的彈性策略一起執行,實現更全面和靈活的故障處理方法。

將 Polly 與 IronPDF 整合如何處理 PDF 生成中的瞬態故障?

通過將 Polly 與 IronPDF 整合,開發者可以通過重試和斷路器等策略來處理 PDF 生成中的瞬態故障。這樣的整合確保了即使在偶爾的服務中斷下 PDF 生成仍然穩定和可靠。

使用 Polly 與 .NET Core 時的一些常見故障排除策略是什麼?

常見的故障排除策略包括驗證策略配置,例如重試間隔和斷路器閾值,並通過不同場景測試策略以確保正確處理故障和系統的彈性。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。