Polly 重试策略

工作原理

Retry

基本重试:

public static void Retry()
{
    var random = new Random();

    // Policy<> 泛型定义返回值类型, 如若不需要返回值, 可直接使用 Policy
    var obj = Policy<object>

        // Handle<> 可指定需要处理的异常类型
        .Handle<Exception>()

        //也可以使用重载对Exception 进行再次过滤
        //.Handle<Exception>(e => e is NotSupportedException)                

        .Retry(3, (res, i, c) =>
               {
                   //当委托的代码块执行失败时会进入此 Action,
                   //这里可以对抛出的异常进行日志或其他处理
                   Console.WriteLine($"retry {i}th times, ex: {res.Exception?.Message}");
               })
        .Execute(() =>
                 {
                      var val = random.Next(0, 100);
                    switch (val % 3)
                    {
                        case 0:
                            return "Success";
                        default:
                            throw new Exception($"random val: {val}");
                    }
                 });
    Console.WriteLine(obj);
}

输出:

重试一次成功:

重试两次成功:

重试三次均失败:

可以看到,再超过重试次数的时候, 若程序还是异常,则抛出异常。

RetryForever

成功前一直重试:

public static void RetryForever()
{
    var random = new Random();

    // Policy<> 泛型定义返回值类型, 如若不需要返回值, 可直接使用 Policy
    var obj = Policy<object>

        // Handle<> 可指定需要处理的异常类型
        .Handle<Exception>()

        //也可以使用重载对Exception 进行再次过滤
        //.Handle<Exception>(e => e is NotSupportedException)                

        .RetryForever((res, i, c) =>
                      {
                          //当委托的代码块执行失败时会进入此 Action,
                          //这里可以对抛出的异常进行日志或其他处理
                          Console.WriteLine($"retry {i}th times, ex: {res.Exception?.Message}");
                      })
        .Execute(() =>
                 {
                     var val = random.Next(0, 100);
                     switch (val % 999)
                     {
                         case 0:
                             return $"Success, val: {val}";
                         default:
                             throw new Exception($"random val: {val}");
                     }
                 });

    Console.WriteLine(obj);
}

输出:

case 0: 这个分支去掉, 任务将变为不可能成功,会发现一直输出重试。

WaitAndRetry

程序异常后做短暂延迟再次重试:

.WaitAndRetry(5, 

                // 设置 Sleep Duration Provider 来提供延迟时间
                retryTimes => TimeSpan.FromSeconds(Math.Pow(2, retryTimes)),

                (res, delay, times, context) =>
                {
                    //当委托的代码块执行失败时会进入此 Action,
                    //这里可以对抛出的异常进行日志或其他处理
                    Console.WriteLine($"retry {times}th times, sleep: {delay.TotalSeconds}s, ex: {res.Exception?.Message}");
                })

可以看到我们在 WaitAndRetry 方法中提供了延迟方式: retryTimes => TimeSpan.FromSeconds(Math.Pow(2, retryTimes)),, 这是一种比较典型的延迟方式,叫做 指数退避。

输出:

WaitAndRetryForever

.WaitAndRetryForever(

                // 设置 Sleep Duration Provider 来提供延迟时间
                (retryTimes, res, context) => TimeSpan.FromSeconds(Math.Pow(2, retryTimes)),

                (res, times, delay, context) =>
                {
                    //当委托的代码块执行失败时会进入此 Action,
                    //这里可以对抛出的异常进行日志或其他处理
                    Console.WriteLine($"retry {times}th times, sleep: {delay.TotalSeconds}s, ex: {res.Exception?.Message}");
                })

仅仅与 WaitAndRetrySleepDurationProvider 的参数有点不同

小结

此篇大体概括了 Polly 重试的几种方式, 当然 Polly Retry 还有很多重载, 但作用都是围绕 程序异常时进行自我调整再重试 为中心。

原文地址:https://www.cnblogs.com/rajesh/p/10773564.html

时间: 2024-08-30 18:13:46

Polly 重试策略的相关文章

微服务之Polly熔断策略

紧接着上一篇说,咱们继续介绍Polly这个类库 熔断策略(Circuit-breaker) 如果调用某个目标服务出现过多超时.异常等情况,可以采取一定时间内熔断该服务的调用,熔断期间的请求将不再继续调用目标服务,而是直接返回,节约资源,提高服务的稳定性,熔断周期结束后如果目标服务情况好转则恢复调用. 注意:为了服务的稳定性,在执行需要多次 Retry重试策略的情况下( 重试策略,感兴趣的小伙伴可以查看我上一篇,或者自行搜索),最好组合熔断策略,预防可能存在的风险. 熔断状态 打开(Open) 熔

Polly 熔断策略

熔断策略主要以 CircuitBreaker 来完成. 工作原理 熔断器可以被看作为一个主要含有三个状态的状态机 如果以电路开关来看: 开关闭合对应 CLOSED 状态, 开关打开对应 OPEN 状态, 而 HALF OPEN 只是为了过渡处理过程中的状态变化 OPEN 状态, FLOW 不通 CLOSED 状态, FLOW 正常 CLOSED 熔断器的初始状态就是 CLOSED, 当熔断器状态为 CLOSED 的时候: 所有通过策略的操作将会被执行, 熔断器也会记录这些操作的失败与成功 如果通

feginclient和ribbon的重试策略

//自定义重试次数// @Bean// public Retryer feignRetryer(){// Retryer retryer = new Retryer.Default(100, 1000, 2);// return retryer;// } 如果设置了feginclient的重试次数(2次),那么fegin将会使用轮训的方式重试nextServer. 如果要使用ribbon作为重试,要把feginclient的超时时间配置和重试配置去掉.ribbon: MaxAutoRetries

使用 Polly 实现复杂策略(超时重试)

一.背景 第一次接触 Polly 还是在做某个微服务系统的时候,那时只会使用单一的超时策略与重试策略,更加高级的特性就没有再进行学习了.最近开为某个客户开发 PC 端的上位机的时候,客户有个需求,在发起请求之后如果 5 秒钟没有响应则进行重试,总共可以重试 3 次,如果 3 次请求都未返回数据,就视为请求失败. 关于 Polly 的高级用法可以参考官方的 Wiki 文档即可,国内也有很多优秀的介绍文章,例如 这篇 和 这篇. 二.思路 查阅了 Polly 的官方文档之后,发现 Polly 提供了

Polly的多种弹性策略介绍和简单使用

什么是Polly? Polly是一个.NET弹性和瞬态故障处理库.允许我们以非常顺畅和线程安全的方式来执行诸如行重试,断路,超时,故障恢复等策略. Polly项目地址:https://github.com/App-vNext/Polly Polly提供多种弹性策略:重试(Retry),断路器(Circuit-breaker),超时检测(Timeout),缓存(Cache),降级(FallBack) 重试(Retry): 前置条件:许多故障是短暂的,并且可能在短暂延迟后自我纠正 政策如何缓解:允许

Polly公共处理 -重试(Retry)

封装处理下Polly重试 private ILogger<PollyHelper> _logger; /// <summary> /// /// </summary> /// <param name="logger"></param> public PollyHelper(ILogger<PollyHelper> logger) { _logger = logger; } /// <summary> /

已被.NET基金会认可的弹性和瞬态故障处理库Polly介绍

前言 本节我们来介绍一款强大的库Polly,Polly是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略. Polly针对对.NET 4.0,.NET 4.5和.NET Standard 1.1以及.NET Core实现,该项目作者现已成为.NET基金会一员,项目一直在不停迭代和更新,项目地址[https://github.com/App-vNext/Polly],你值得拥有.接下来我们以.NET Framework  4.5来演示它

弹性和瞬态故障处理库Polly

已被.NET基金会认可的弹性和瞬态故障处理库Polly介绍 前言 本节我们来介绍一款强大的库Polly,Polly是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略. Polly针对对.NET 4.0,.NET 4.5和.NET Standard 1.1以及.NET Core实现,该项目作者现已成为.NET基金会一员,项目一直在不停迭代和更新,项目地址[https://github.com/App-vNext/Polly],你值得拥有

LindDotNetCore~Polly组件对微服务场景的价值

回到目录 Polly是一个开源框架,在github上可以找到,被善友大哥收录,也是.App vNext的一员! App vNext:https://github.com/App-vNext GitHub:https://github.com/App-vNext/Polly NanoFabric是一个开源的微服务架构,也是善友大哥推荐的:https://github.com/geffzhang/NanoFabric 对于NanoFabric来说,它集成了很多.net core开源项目,其中包括了C