.net core polly(一)
nuget 下载
Polly
超时策略 超时策略分 乐观 和 悲观
#region Polly超时策略 //Pessimistic 悲观策略 var Pessimistic = await Policy.TimeoutAsync(2, Polly.Timeout.TimeoutStrategy.Pessimistic, (context, tiemspan, t) => { Console.WriteLine("超时了"); return Task.CompletedTask; }).ExecuteAsync(async () => { Console.WriteLine("业务逻辑开始"); await Task.Delay(10000); return Task.CompletedTask; }); //Optimistic 乐观策略 var Optimistic = await Policy.TimeoutAsync(2, Polly.Timeout.TimeoutStrategy.Optimistic, (context, time, task) => { Console.WriteLine("超时了"); return Task.CompletedTask; }).ExecuteAsync(async () => { Console.WriteLine("业务逻辑开始"); await Task.Delay(50000); return Task.CompletedTask; });
重试策略
1 #region 重试策略 2 //根据 http请求 状态码 重试 3 var RetryAsync = await Policy.Handle<HttpRequestException>((exception) => 4 { 5 return (int)exception.StatusCode == 511; 6 7 }).RetryAsync(3).ExecuteAsync(async () => 8 { 9 Console.WriteLine("策略策略重试中"); 10 throw new HttpRequestException("错误", new Exception(), HttpStatusCode.NetworkAuthenticationRequired); 11 12 return Task.CompletedTask; 13 }); 14 15 #endregion
服务降级
#region 服务降级 var fallback = Policy<string>.Handle<HttpRequestException>((exception) => { Console.WriteLine("因为收到了异常开始降级"); return exception.StatusCode == HttpStatusCode.VariantAlsoNegotiates; }).Or<Exception>().FallbackAsync("FALLBACK", (token) => { return Task.CompletedTask; }).WrapAsync(Policy.Handle<HttpRequestException>().RetryAsync(3));//失败重试 3次 //执行业务方法 string reuslt = await fallback.ExecuteAsync(async () => { Console.WriteLine("执行业务"); // throw new HttpRequestException("失败", new Exception(), HttpStatusCode.VariantAlsoNegotiates); throw new Exception(""); return await Task.FromResult<string>("业务执行结束"); }); //降级方法 if (reuslt == "FALLBACK") { Console.WriteLine("收到FALLBACK了,我降级了"); } #endregion
服务熔断 状态 有 关闭 打开 半打开
断路(Circuit-breaker)
当系统遇到严重问题时,快速回馈失败比让用户/调用者等待要好,限制系统出错的体量,有助于系统恢复。比如,当我们去调一个第三方的 API,有很长一段时间 API 都没有响应,可能对方服务器瘫痪了。如果我们的系统还不停地重试,不仅会加重系统的负担,还会可能导致系统其它任务受影响。所以,当系统出错的次数超过了指定的阈值,就要中断当前线路,等待一段时间后再继续。
下面是一个基本的断路策略的使用方式:
Policy.Handle<SomeException>()
.CircuitBreaker(2, TimeSpan.FromMinutes(1));
这句代码设定的策略是,当系统出现两次某个异常时,就停下来,等待 1 分钟后再继续。这是基本的用法,你还可以在断路时定义中断的回调和重启的回调。
.NET 开源项目 Polly 介绍 - 精致码农 - 博客园 (cnblogs.com)
#region 服务熔断 状态 有 关闭 打开 半打开 var CircuitBreakerAsync = Policy.Handle<Exception>().CircuitBreakerAsync( exceptionsAllowedBeforeBreaking: 2, durationOfBreak: TimeSpan.FromSeconds(5), //打开断路器 onBreak: (ex, ts) => { Console.WriteLine("打开断路器"); }, //关闭断路器 onReset: () => { Console.WriteLine("关闭断路器"); }, //半开 onHalfOpen: () => { Console.WriteLine("半开断路器"); } ); var retry = Policy.Handle<HttpRequestException>().RetryAsync(3); var polly = Policy<string>.Handle<HttpRequestException>() .Or<BrokenCircuitException>() .FallbackAsync("FallBack", (token) => { return Task.CompletedTask; }).WrapAsync(CircuitBreakerAsync.WrapAsync(retry)); //执行业务方法 var reuslt = ""; do { reuslt = await polly.ExecuteAsync(() => { Console.WriteLine("执行业务方法"); throw new HttpRequestException("错误", new Exception(), HttpStatusCode.UpgradeRequired); return Task.FromResult("FallBack"); }); } while (reuslt == "FallBack"); if (reuslt != "FallBack") { Console.WriteLine("这里是不等于"); } else { Console.WriteLine("降级方法开始"); } #endregion