- 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)));
重试策略的使用步骤:
- 指定需要处理的异常
- 指定重试次数和监控重试
- 指定执行的任务
- Policy
- .Timeout(10, (context, timeSpan, task) =>
- {
- Console.WriteLine("1");
- });
在执行某个任务时,多次重试依然出现超时或则异常,且重试的次数已经超过了系统设定上限。此时中断当前的执行,快速响应失败信息给用户,等待一段时间再进行恢复,继续执行。
- 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后重试
当我们的操作注定会失败时,我们就需要有一个合理的返回信息来替代失败信息,即备用方案。
- Policy
- .Handle
() - .Fallback(fallbackAction: () => { }, onFallback: (ex) => { });
- Policy.Handle
() - .Fallback
(() => UserAvatar.GetRandomAvatar())
当进程出现故障,多次失败,并一直占用主机的资源, 此时用隔离板隔离有互相影响的操作,将受管制的资源 限制在一个固定的资源池中。
- Policy.Bulkhead(10, (context) => { });
- //指定最大的线程数,,若执行被拒绝,则执行回调
当 数据更新周期较长且使用频繁,我们可以首次加载这些数据时将这些数据缓存起来。
- ISyncCacheProvider cacheProvider = new StubCacheProvider();
- Func
string > 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"));
不同的异常需要不同的策略,弹性的使用策略来应对不同的异常信息。
- 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(...);