c# 弹性和瞬态故障处理库Polly 学习

关于Polly

                                                                    640?wx_fmt=png

 

   Polly是一个基于.NET的弹性及瞬态故障处理库,允许开发人员以顺畅及线程安全的方式执行重试(Retry)、断路(Circuit Breaker)、超时(Timeout)

     隔离(Bulkhead Isolation)和回退策略(Fallback ).Polly适用于 .NET 4.0, .NET 4.5 和.NET Standard 1.1。

     以上是官方文档对polly库的介绍。

     polly的介绍中有个很关键的词是瞬态故障,这个词也很好的诠释了Polly使用的一个背景.瞬态故障,就是指我们的程序在运行当中可能会发生故障,

     这些故障包含程序运行中的异常、返回结果不符等。弹性是指Polly在应对这些故障时具有灵活性,且其提供的策略也可以很灵活的组合在一起使用。

Polly的使用

    方式1:在Nuget中下载Polly安装包,安装成功即可使用

                  Install-Package Polly

     方式2:在github中下载Polly源码

                 https://github.com/App-vNext/Polly

Polly策略

 

   一、重试(Retry)

       异常重试是最常使用的一个策略,其功能是当我们执行的方法体发生异常时,可以按照我们指定的次数进行重试


Policy
.Handle<NullReferenceException>()    //指定需要重试的异常类型
.Retry(2,(ex,count,context)=> {      //指定发生异常重试的次数
     Console.WriteLine($ "重试次数{count},异常{ex.Message}" );
})                                         
.Execute(() => Console.Write( "execute method!" ));     //要执行的方法

    Polly的所有策略使用都支持链式调用。

      Polly重试策略的使用分为三个步骤

   1、指定需要处理的异常

         可以指定捕获执行的任务的异常类型,若执行任务的异常类型满足指定异常,那么重试机制将会生效

     2、指定重试次数和监控重试

        指定整个执行过程中需要重试多少次,且可以监控每次的重试信息,比如重试次数  异常以及重试的上下文信息

   3、指定执行的任务

        指定执行的任务是整个异常重试的核心和监控对象,Execute支持多种重载.。

          重试策略支持异步任务      

public async Task PollyStudy()

        {

            int num = await Policy

                .Handle<Exception>()

                .RetryAsync(2, (ex, count, context) =>

                {

                    Console.WriteLine($"重试次数{count},异常{ex.Message}");

                })

                .ExecuteAsync<int>(() =>

                {

                    return GetNum();

                });

        }


        public async Task<int> GetNum()

        {

            await Task.Delay(10000);

            return 1;

        }

  二、超时(Timeout) 

       超时策略主要用于对任务执行的执行时长监控,若任务执行超出指定执行时长,那么我们就认为这次任务执行是失败的,

      不会再去等待结果

       超时策略最基本的设置:

             Policy
            .Timeout(10, (context, timeSpan, task) =>
           {
                Console.WriteLine("1");
            });

   三、熔断(Circuit-breaker    

     熔断在这里的含义在执行某个任务时,多次重试依然出现超时或则异常,且重试的次数已经超过了系统设定上限.

     那么就中断当前的执行,快速响应失败信息给用户,等待一段时间再进行恢复,继续执行.


var  breakerPlocy = Policy.Handle<Exception>()      //指定异常
                          .CircuitBreaker(5, TimeSpan.FromSeconds(30),                //设置5次阀值,中断30秒
                          onBreak: (ex, timeSpan) => { Console.WriteLine( "onBreak" ); },  //中断回调
                          onReset: () => { Console.WriteLine( "onReset" ); });             //重置回调

    熔断的基本策略设置如上代码所示,上面的代码可以解析为当某个任务超过5次异常时,我们进行中断处理,等待30秒后再次继续.

    我们设置了中断回调和重启回调函数,可以记录当中的执行信息.

  四、回退(Fallback)

   回退策略的前置条件是当我们的操作注定会失败时,我们就需要有一个合理的返回信息来替代失败信息,也就是提供一个备用方案,

   从而能对我们的失败操作进行挽救.


Policy
         .Handle<Exception>()                
         .Fallback(fallbackAction: () => { }, onFallback: (ex) => { });  

    回退策略的基本设置如上所示,我们可以定义备用的返回信息,同时可以定义回调

   五、隔板隔离策略

    隔板隔离的前置条件是当进程出现故障时,多个失败一直在主机中对资源一直占用。下游系统故障也可能导致上游系统的故障,

   这些风险都可能导致系统产生严重的后果.而隔板隔离策略可以隔离有相互影响的操作,将受管制的草需哦限制在一个固定的资源池中

            Policy.Bulkhead(10, 15, (context) => { });

 指定最大的线程数,和正在排队的队列数,若执行被拒绝,则执行回调.

 六、缓存策略

  缓存策略的前置条件是我们的数据更新周期较长且使用频繁,我们可以首次加载这些数据时将这些数据缓存起来,

  如果数据已经存在那么我们直接从缓存中读取. 


ISyncCacheProvider cacheProvider =  new  StubCacheProvider();
             Func<Context,  string > cacheKeyStrategy =  null ;
             Action action = () => Policy.Cache(cacheProvider, TimeSpan.MaxValue, cacheKeyStrategy);

  缓存策略在某些情况下简化我们的缓存实现是很有帮助的.

七、策略包装策略

  策略包装策略的前置条件是不同的异常需要不同的策略,也就是需要我们弹性的使用策略来应对不同的异常信息.


NoOpPolicy policy0 = Policy.NoOp();
            NoOpPolicy policy1 = Policy.NoOp();
            NoOpPolicy policy2 = Policy.NoOp();
            PolicyWrap policyWrap = Policy.Wrap(policy0, policy1, policy2);

  

总结

  上面简单介绍了polly七大策略和其基本配置,Polly实际功能很强大,是一个很值得仔细学习的库.

  后面会详细介绍Polly的几大策略以及在实际项目中的一个应用

相关文章:

原文地址: https://www.cnblogs.com/xxue/p/9902669.html


 
 

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值