如何在 C# 中使用 Polly:轻松处理故障和重试

概述:在本文中,我们将探讨如何在 C# 中使用 Polly,以及它如何帮助轻松处理错误和重试。Polly 是一个常用的 NuGet 包,它提供了一组强大的工具和模式,可以大大简化代码中的故障处理和重试机制。通过在代码中利用 Polly,我们可以处理各种类型的故障,例如网络错误或数据库连接失败。然后,我们可以实施智能重试策略,以确保当其中一个不可避免地出现问题时,我们的应用程序不会崩溃(记住:墨菲定律)。Polly 提供了一种灵活且可配置的方式来处理这些情况,无论我们是需要处理暂时性故障还是只是重试失败的操作。我将向您展示 3 个有趣的代码示例,这些示例展示了 Polly 在 C# 中的不同用例——所

在本文中,我们将探讨如何在 C# 中使用 Polly,以及它如何帮助轻松处理错误和重试。Polly 是一个常用的 NuGet 包,它提供了一组强大的工具和模式,可以大大简化代码中的故障处理和重试机制。

通过在代码中利用 Polly,我们可以处理各种类型的故障,例如网络错误或数据库连接失败。然后,我们可以实施智能重试策略,以确保当其中一个不可避免地出现问题时,我们的应用程序不会崩溃(记住:墨菲定律)。Polly 提供了一种灵活且可配置的方式来处理这些情况,无论我们是需要处理暂时性故障还是只是重试失败的操作。

我将向您展示 3 个有趣的代码示例,这些示例展示了 Polly 在 C# 中的不同用例——所以让我们开始吧!

1 — 在 C 语言中使用 Polly 处理故障#

在构建健壮可靠的应用程序时,有效处理故障非常重要。错误处理是指处理程序执行过程中可能发生的错误、异常和失败,我们将使用 C# 中的 Polly 来帮助我们。

为了演示 Polly 如何处理连接问题,让我们考虑一个场景,我们的应用程序需要向外部 API 发出网络请求。我们希望确保在出现任何与连接相关的故障(例如临时网络中断或间歇性故障)时自动重试请求。

让我们看看如何在 C# 中使用 Polly 来处理网络请求中的连接问题:

using Polly;  
using Polly.Retry;  
  
var handler = new NetworkRequestHandler();  
var response = await handler.MakeNetworkRequestAsync("https://www.devleader.ca/sitemap.xml");  
Console.WriteLine($"Response status code: {response.StatusCode}");  
  
public class NetworkRequestHandler  
{  
    private readonly HttpClient _httpClient;  
    private readonly AsyncRetryPolicy<HttpResponseMessage> _retryPolicy;  
  
    public NetworkRequestHandler()  
    {  
        _httpClient = new HttpClient();  
  
        // Define a retry policy: retry on HttpRequestException, 3 retries with exponential backoff  
        _retryPolicy = Policy  
            .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)  
            .Or<HttpRequestException>()  
            .WaitAndRetryAsync(3, retryAttempt =>  
                TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),  
                onRetry: (outcome, timespan, retryAttempt, context) =>  
                {  
                    Console.WriteLine($"Request failed with {outcome.Exception?.Message}. Waiting {timespan} before next retry. Retry attempt {retryAttempt}.");  
                });  
    }  
  
    public async Task<HttpResponseMessage> MakeNetworkRequestAsync(string requestUri)  
    {  
        return await _retryPolicy.ExecuteAsync(async () =>  
        {  
            Console.WriteLine($"Making request to {requestUri}");  
            var response = await _httpClient.GetAsync(requestUri);  
            if (!response.IsSuccessStatusCode)  
            {  
                Console.WriteLine($"Request failed with status code: {response.StatusCode}");  
                throw new HttpRequestException($"Request to {requestUri} failed with status code {response.StatusCode}");  
            }  
            return response;  
        });  
    }  
}

在上面的代码示例中,我们定义了一个类,该类封装了使用 .NET Framework 中的类发出网络请求的逻辑。我们用 类型的故障条件从 Polly 初始化 a。这意味着每当抛出 an 时,都会触发该策略。NetworkRequestHandlerHttpClientAsyncRetryPolicyHttpRequestExceptionHttpRequestException

该方法用于指定重试次数和每次重试之间的时间延迟。在此示例中,我们重试请求 3 次,使用公式 以指数方式增加延迟。WaitAndRetryTimeSpan.FromSeconds(Math.Pow(2, retryAttempt))

在该方法中,我们使用 Polly 策略通过调用策略上的方法来执行网络请求。如果在执行过程中发生 a,Polly 将根据定义的策略自动重试请求。MakeNetworkRequestExecuteHttpRequestException

2 — 在 C# 中使用 Polly 的重试机制

在软件工程中,经常会遇到特定操作可能由于网络问题、资源限制或其他暂时性故障而暂时失败的情况。在这种情况下,将实施重试机制,以自动重试失败的操作一定次数,直到它成功或达到最大重试计数。这有助于提高软件应用程序的可靠性和健壮性。

在 C# 中使用 Polly 简化重试机制:

在 C# 中实现重试机制时,NuGet 包 Polly 可以派上用场。Polly 是一个功能强大的库,它提供了一种简单而优雅的方法来处理代码中的错误和重试。它通过将复杂的重试逻辑封装到一组可重用的策略中来简化实现重试的过程。

使用 Polly 自动重试失败的数据库操作:

让我们考虑一个场景,我们需要执行数据库操作,例如将记录插入到表中,但可能存在可能导致操作失败的临时连接问题或资源限制。使用 Polly,我们可以通过应用重试策略轻松处理此类故障。

首先,我们需要通过将以下行添加到项目文件的依赖项部分来安装 Polly NuGet 包(请记住,要获取的版本可能更新!

<ItemGroup>  
    <PackageReference Include="Polly" Version="8.3.0" />  
</ItemGroup>

安装包后,我们就可以开始使用 Polly 来实现重试机制。下面是一个示例代码片段,演示如何使用 Polly 自动重试失败的数据库操作:

using Polly;  
  
using System.Data.SqlClient;  
  
async Task<bool> InsertRecordAsync(  
 Record record,  
 CancellationToken cancellationToken)  
{  
    int maxRetryCount = 3;  
    var connectionString = "// TODO: configure this elsewhere...";  
  
    var retryPolicy = Policy  
        .Handle<SqlException>() // Specify the type of exception to handle  
        .WaitAndRetryAsync(maxRetryCount, retryAttempt =>  
            TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // Exponential backoff strategy  
  
    return await retryPolicy.ExecuteAsync(async ct =>  
    {  
        using var connection = new SqlConnection(connectionString);  
        await connection.OpenAsync();  
  
        using var command = connection.CreateCommand();  
        command.CommandText = "INSERT INTO Records (Id, Name) VALUES (@Id, @Name)";  
        command.Parameters.AddWithValue("@Id", record.Id);  
        command.Parameters.AddWithValue("@Name", record.Name);  
  
        try  
        {  
            // Perform the database operation   
            var result = await command.ExecuteNonQueryAsync(ct);  
            return result == 1;  
        }  
        catch (SqlException)  
        {  
            // Rethrow the exception to let Polly handle the retry logic  
            throw;  
        }  
    }, cancellationToken);  
}  
  
public sealed record Record( int Id,   string Name);

在上面的示例中,我们使用该方法来定义重试策略,以指定要处理的异常类型,在本例中为 SQL 异常。然后,我们使用该方法配置策略,以使用指数退避策略重试操作,每次重试尝试都会等待越来越多的时间。Policy.Handle<SqlException>()WaitAndRetryAsyncmaxRetryCount

在方法中,我们将数据库操作包装在一个 try-catch 块中。如果操作由于 SQL 异常而失败,我们会抛出异常,让 Polly 处理重试逻辑。Polly 会根据定义的策略自动重试操作,提供处理临时故障的无缝体验。ExecuteAsync

3 — C# 语言中 Polly 的高级重试和断路器模式

有时,我们需要更高级的重试机制和断路器模式,才能使我们在应用程序中达到下一个弹性水平。幸运的是,C# 中的 Polly 库也为我们提供了这些内容!

使用外部服务或资源时,通常会遇到暂时性故障,例如网络问题或服务不可用。Polly 允许我们定义自定义重试策略,这些策略规定重试的次数以及重试之间的延迟。这确保了我们的应用程序能够优雅地处理临时故障并提高系统的整体可靠性。

使用 Polly 自定义重试策略

Polly 提供了灵活的选项,可根据特定要求自定义重试策略。我们可以定义重试次数、确定重试之间延迟的回退策略,甚至可以定义一个谓词,以便仅在某些异常时有选择地重试。通过定制这些策略,我们可以有效地处理不同的场景。

下面是一个示例,演示如何使用 Polly 通过指数退避策略实现重试策略:

var retryPolicy = Policy  
    .Handle<HttpRequestException>()  
    .OrResult<HttpResponseMessage>(response => response.StatusCode == HttpStatusCode.InternalServerError)  
    .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

在此示例中,我们定义了一个重试策略,如果 或 的状态代码为 ,则该策略将重试操作最多 3 次。回退策略是指数级的,重试之间的延迟根据重试次数呈指数级增加。HttpRequestExceptionHttpResponseMessageInternalServerError

在 C# 语言中使用 Polly 实现断路器模式#

断路器模式在防止级联故障和保护系统免受对故障服务的一系列重复请求方面发挥着重要作用。Polly 为实现断路器模式提供了内置支持,这有助于自动管理断路器的状态并控制请求流。

要使用 Polly 实现断路器模式,我们需要定义失败和成功的阈值,以及监控这些指标的时间窗口。一旦断路器跳闸,进一步的请求就会短路,从而防止对故障服务进行不必要的呼叫。

下面是如何使用 Polly 实现断路器模式的示例:

var circuitBreakerPolicy = Policy  
    .Handle<HttpRequestException>()  
    .OrResult<HttpResponseMessage>(response => response.StatusCode == HttpStatusCode.InternalServerError)  
    .CircuitBreakerAsync(3, TimeSpan.FromSeconds(30));

在此示例中,断路器策略配置为在 30 秒窗口内连续发生 3 次故障时跳闸打开。断路器打开后,后续请求将被自动拒绝,从而阻止进一步的调用,直到指定的恢复期过去。

现在您知道如何在 C# 中使用 Polly!

你已经做到了!你有 3 个工作代码示例来帮助你了解如何在 C# 中使用 Polly。借助 Polly,您可以轻松处理故障和重试,从而提高应用程序的可靠性和弹性。在本文中,我们探讨了 Polly 的三个不同用例,包括故障处理、基本重试和高级重试模式(如断路器)。

通过将 Polly 整合到您的项目中,您可以增强软件的稳定性和响应能力。通过使用策略指定重试计数、持续时间和其他可配置参数,您可以控制应用程序在遇到故障时的行为和容差。

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/79049.html

(0)
guozi的头像guozi
上一篇 2024年5月30日
下一篇 2024年5月30日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注