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

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

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

搜索NuGet 包管理器安装 Polly 库

一、重试策略~

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

1、处理异常并进行重试

// 创建一个策略,用于处理异常并进行重试
Policy policy = Policy.Handle<Exception>()
    .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<Exception>()
    .Retry(3, (exception, retryCount, context) =>
    {
        Console.WriteLine($"正在使用键{context[“myKey”]}重试操作。重试尝试{retryCount}");
    });

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值