Polly重试,熔断,超时,隔板,回退 基本使用
Polly基础使用
安装包:Install-Package Polly
一、重试
1、设定重试策略
var retryPolicy = Policy.Handle<Exception>() .WaitAndRetry(new List<TimeSpan>() { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(5) }, //每次错误的回调方法 (exception, timespan) => { //执行错误方法 });
2、调用
retryPolicy.Execute(() => { //执行你的业务代码 });
二、熔断器
1、定义策略
//如果当前连续有两个异常,那么触发熔断,10s内不能调用,10s之后重新调用。 //一旦调用成功了,熔断就解除了。 var policy = Policy.Handle<WebException>() //触发熔断的异次数,熔断的时间间隔(秒) 触发熔断的回调方法 .CircuitBreaker(2,TimeSpan.FromSeconds(10), (ex, timespan, context) => { //触发熔断 Console.WriteLine($"{DateTime.Now} 熔断触发:{timespan}"); }, (context) => { //恢复熔断 Console.WriteLine($"{DateTime.Now} 熔断恢复"); });
2、调用
try { var msg = policy.Execute<string>((context, token) => { //业务代码 }, new Dictionary<string, object>() { { "传给断容的回方法的参数", "传给断容的回调方法的参数") } }, CancellationToken.None); Console.WriteLine("logic:" + msg); } catch (Exception ex) //熔断触发后,在熔断时间内都执行以下下逻辑 { Console.WriteLine(string.Format("{0} 业务逻辑异常:'{1}'", DateTime.Now, ex.Message)); }
三、超时
1、设置超时时间
//10s后 cancellationToken过期 var policy = Policy.Timeout(10);
2、通过cancellationToken进行传值,如果10s过去,IsCancellationRequested 自动变成取消状态
var cancellationToken = new CancellationToken(); policy.Execute((token) => { for (int i = 0; i < 1000; i++) { //大家需要根据这个状态来做具体的业务逻辑, 10s后 token.IsCancellationRequested==True Console.WriteLine(token.IsCancellationRequested); System.Threading.Thread.Sleep(1000); } }, cancellationToken);
四、隔板隔离
var policy = Policy.Bulkhead(5, 1000); //设置并发数,等待处理的最大数 Parallel.For(0, 100, (i) => { //这里只能做一次调用 var result = policy.Execute<string>(() => { return GetHtml("http://cnblogs.com"); }); Console.WriteLine("已成功获取到数据:{0}", result); });
五、回退
var result = Policy<string>.Handle<WebException>()
.Fallback(() => { return "接口失败,这个fake的值给你!"; }) .Execute(() => {
return GetHtml("http://1cnblogs.com"); //调用成功返回此值 }); Console.WriteLine(result);