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

1. 重试(Retry)

Policy
.Handle()    //指定需要重试的异常类型
.Retry(2,(ex,count,context)=> {      //指定发生异常重试的次数
     Console.WriteLine($ "重试次数{count},异常{ex.Message}" );
})                                         
.Execute(() => Console.Write( "execute method!" )); //指定执行的方法
const int retryTimes = 2;//重连次数
static RetryPolicy policy = Policy.Handle().WaitAndRetry(retryTimes, retryAttempt => TimeSpan.FromSeconds(Math.Pow(0, retryAttempt)));

重试策略的使用步骤:

  • 指定需要处理的异常
  • 指定重试次数和监控重试
  • 指定执行的任务

2. 超时(Timeout)

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

3. 熔断(Circuit-breaker)

在执行某个任务时,多次重试依然出现超时或则异常,且重试的次数已经超过了系统设定上限。此时中断当前的执行,快速响应失败信息给用户,等待一段时间再进行恢复,继续执行。

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

//当系统出现2次某个异常后,停止重试,等待1min后重试

 

4. 回退(Fallback)

当我们的操作注定会失败时,我们就需要有一个合理的返回信息来替代失败信息,即备用方案。

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

 

5. 隔板隔离策略

当进程出现故障,多次失败,并一直占用主机的资源, 此时用隔离板隔离有互相影响的操作,将受管制的资源 限制在一个固定的资源池中。

Policy.Bulkhead(10, (context) => { });
//指定最大的线程数,,若执行被拒绝,则执行回调

6.缓存策略

当 数据更新周期较长且使用频繁,我们可以首次加载这些数据时将这些数据缓存起来。

ISyncCacheProvider cacheProvider =  new  StubCacheProvider();
Func cacheKeyStrategy =  null ;
Action action = () => Policy.Cache(cacheProvider, TimeSpan.MaxValue, cacheKeyStrategy);
var memoryCacheProvider = new MemoryCacheProvider(myMemoryCache);
var cachePolicy = Policy.Cache(memoryCacheProvider, TimeSpan.FromMinutes(5));
TResult result = cachePolicy.Execute(context => getFoo(), new Context("FooKey"));

 

7. 策略包装策略

不同的异常需要不同的策略,弹性的使用策略来应对不同的异常信息。

NoOpPolicy policy0 = Policy.NoOp();
NoOpPolicy policy1 = Policy.NoOp();
NoOpPolicy policy2 = Policy.NoOp();
PolicyWrap policyWrap = Policy.Wrap(policy0, policy1, policy2);
var policyWrap = Policy
  .Wrap(fallback, cache, retry, breaker, timeout, bulkhead);
policyWrap.Execute(...);

 

你可能感兴趣的:(c#,开发语言)