1. 重试(Retry)
Policy
.Handle<Exception>() //指定需要重试的异常类型
.Retry(2,(ex,count,context)=> { //指定发生异常重试的次数
Console.WriteLine($ "重试次数{count},异常{ex.Message}" );
})
.Execute(() => Console.Write( "execute method!" )); //指定执行的方法
const int retryTimes = 2;//重连次数
static RetryPolicy policy = Policy.Handle<Exception>().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<Exception>() //指定异常类型
.CircuitBreaker(5, TimeSpan.FromSeconds(30), //设置5次阀值,中断30秒
onBreak: (ex, timeSpan) => { Console.WriteLine( "onBreak" ); }, //中断回调
onReset: () => { Console.WriteLine( "onReset" ); }); //重置回调
Policy.Handle<SomeException>()
.CircuitBreaker(2, TimeSpan.FromMinutes(1));
//当系统出现2次某个异常后,停止重试,等待1min后重试
4. 回退(Fallback)
当我们的操作注定会失败时,我们就需要有一个合理的返回信息来替代失败信息,即备用方案。
Policy
.Handle<Exception>()
.Fallback(fallbackAction: () => { }, onFallback: (ex) => { });
Policy.Handle<Whatever>()
.Fallback<UserAvatar>(() => UserAvatar.GetRandomAvatar())
5. 隔板隔离策略
当进程出现故障,多次失败,并一直占用主机的资源, 此时用隔离板隔离有互相影响的操作,将受管制的资源 限制在一个固定的资源池中。
Policy.Bulkhead(10, (context) => { });
//指定最大的线程数,,若执行被拒绝,则执行回调
6.缓存策略
当 数据更新周期较长且使用频繁,我们可以首次加载这些数据时将这些数据缓存起来。
ISyncCacheProvider cacheProvider = new StubCacheProvider();
Func<Context, 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"));
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(...);