跳過到頁腳內容
.NET幫助

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

Polly是.NET彈性策略和瞬態故障處理庫,可讓開發人員表達彈性策略,例如重試策略、斷路器、逾時、隔離艙壁策略和回退。 Polly 針對ASP.NET Core,使其成為.NET Core彈性的重要工具。 Polly 是線程安全的,支援處理多個並發請求並成功回應。

本教學將詳細介紹瞬態故障處理.NET庫 Polly,以及如何在ASP.NET Core應用程式中與IronPDF一起使用。 我們將深入探討 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}");
    });
$vbLabelText   $csharpLabel

阻斷措施政策

斷路器策略允許 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));
$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
$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
$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;
        });
$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);
$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 功能,可確保佈局和樣式保持不變。 此功能可將網頁內容轉換為 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");
    }
}
$vbLabelText   $csharpLabel

讓我們透過一個例子來了解如何使用 Polly 和IronPDF將URL 轉換為 PDF 。 假設我們有一個 Web 服務,它偶爾會因為瞬態故障而發生故障,我們希望使用 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;
$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));
$vbLabelText   $csharpLabel

retryPolicy 將採用指數退避策略重試失敗的請求最多三次,每次重試之間分別等待 2 秒、4 秒和 8 秒。 如果在 30 秒時間間隔內發生兩次連續故障,則 circuitBreakerPolicy 將斷開電路。

現在,讓我們定義IronPDF程式碼,將 URL 轉換為 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");
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");
$vbLabelText   $csharpLabel

在上面的範例程式碼中,我們使用 retryPolicycircuitBreakerPolicy 方法包裝我們的 WrapAsync。 這樣我們就可以依序將多個策略套用到新的請求。 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}");
    }
}
$vbLabelText   $csharpLabel

在上面的程式碼中,我們遍歷一組測試 URL,並嘗試將每個 URL 轉換為 PDF。 如果請求失敗,則會捕獲異常,並在控制台中顯示相應的訊息。

 .NET Core Polly(開發者使用方法):圖 1 - PDF 輸出的 URL

結論

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 時的一些常見故障排除策略是什麼?

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

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me