如何实现重试机制以增加代码的健壮性

实际的软件开发中,我们经常会遇到需要处理连接失败、网络超时或其他临时性问题的情况。为了增加代码的健壮性和可靠性,我们可以使用重试机制来自动重新尝试操作,直到成功或达到最大重试次数。

在.net 中有一个NutGet包库:Policy。这是一个功能比较强大的重试机制库。贼牛。

搜索NuGet 包管理器安装 Polly 库

一、重试策略~

他有好多重试策略针对不同的类型,如:文件上传:、Sql操作、Http操作等等等的重试、熔断、超时、回退等策略。

1、处理异常并进行重试

// 创建一个策略,用于处理异常并进行重试
Policy policy = Policy.Handle()
    .Retry(3, (exception, retryCount) =>
    {
        Console.WriteLine($"由于{exception.Message}. 正在重试操作。重新尝试 {retryCount}");
    });

// 执行操作,并获取策略的执行结果
PolicyResult policyResult = policy.Execute(() =>
{
    // 执行操作
    return SomeOperation();
});

// 根据策略的执行结果进行相应的处理
if (policyResult.Outcome == OutcomeType.Successful)
{
    Console.WriteLine("操作成功");
}
else if (policyResult.Outcome == OutcomeType.Failure)
{
    Console.WriteLine("操作失败");
}

2、处理异常并进行重试,并在重试时使用上下文数据

// 创建一个上下文对象,用于传递和共享数据
Context context = new Context("myKey", "myValue");

// 创建一个策略,处理异常并进行重试,并在重试时使用上下文数据
Policy policy = Policy.Handle()
    .Retry(3, (exception, retryCount, context) =>
    {
        Console.WriteLine($"正在使用键{context[“myKey”]}重试操作。重试尝试{retryCount}");
    });

// 使用上下文执行操作
policy.Execute(context, () =>
{
    // 执行操作
    return SomeOperation();
});

3、指定重试次数和重试间隔

// 创建一个重试策略,指定重试次数和重试间隔
RetryPolicy policy = Policy.Handle()
    .WaitAndRetry(new[]
    {
        TimeSpan.FromSeconds(1),
        TimeSpan.FromSeconds(2),
        TimeSpan.FromSeconds(3)
    });

// 执行操作,并进行重试
policy.Execute(() =>
{
    // 执行操作
    return SomeOperation();
});

4、熔断器策略,指定失败次数和熔断时间

// 创建一个熔断器策略,指定失败次数和熔断时间
CircuitBreakerPolicy policy = Policy.Handle()
    .CircuitBreaker(3, TimeSpan.FromSeconds(10),
        (exception, duration) =>
        {
            Console.WriteLine($"断路器由于{exception.Message}而断开。将在{duration.TotalSeconds}秒后重试");
        },
        () =>
        {
            Console.WriteLine("断路器复位");
        });

// 执行操作,并进行熔断处理
policy.Execute(() =>
{
    // 执行操作
    return SomeOperation();
});

5、回退策略,指定备用逻辑

// 创建一个回退策略,指定备用逻辑
FallbackPolicy policy = Policy.Handle()
    .Fallback(() =>
    {
        // 执行备用逻辑
        return "回退值";
    });

// 执行操作,并在失败时执行备用逻辑
string result = policy.Execute(() =>
{
    // 执行操作
    return SomeOperation();
});

在使用Policy的时候,我们如果使用的是Policy.Handle();它会捕获所有派生自 Exception 类的异常然后进行重试等操作。

我们也可以让他捕获特定种类的异常然后重试:如TimeoutException异常或者HttpRequestException

也可以同时设置多个异常 我举个例子啊:

// 这个代码意思是捕获HttpRequestException异常和TaskCanceledException异常
// 发生异常后会进行3次重试,每次重试等待时间会逐渐增加以指数方式增长(2 的指数幂
// waitAndRetryAsync这个里面的方法是我抄的,很多方法大家可以百度一下。方法太多我也只会用最基本的
var policy = Policy.Handle()
    .Or()
    .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

希望这篇文章对大家有帮助!我也只是记录一下自己的笔记。方便随时查看复用。

你可能感兴趣的:(.NET/C#,c#,.net,.netcore)