Polly:可以用来简化熔断降级的处理。主要功能:出现异常后,重试 断路器 超时检测 缓存 失败处理
熔断降级:防止一个服务请求失败导致整个系统崩溃,熔断后就不去请求此服务,快速失败。如果连续几次失败就触发熔断。间隔一段时间后再次调用,如果还是失败,继续熔断,否则熔断恢复。
断路保护:连续出现N次异常,熔断几秒,等待的这段时间会抛出BrokenCircuitException异常。等待时间结束再执行Excute的时候如果又错了(一次就够),那么继续熔断一段时间,否则回复正常。熔断的目的是避免服务不可用了还是使劲请求给系统造成更大压力
//处理ArgumentException,NullReferenceException异常 //ISyncPolicy policy = Policy // .Handle<ArgumentException>() // .Or<NullReferenceException>() // .Fallback(cancellToken=> { // Console.WriteLine("出错"); //}); ////处理包含"没有姓名参数"ArgumentException的异常 //ISyncPolicy policy = Policy // .Handle<ArgumentException>(argEx => (argEx.Message == "没有姓名参数")) // .Fallback(cancellToken => { // Console.WriteLine("出错"); //}); ////重试3次 //ISyncPolicy policy = Policy // .Handle<Exception>() // .Retry(3);//.RetryForever()//一直试 //间隔1s、5s、10s、20s、1min各重试一次 Polly.Policy.Handle<WebException>().WaitAndRetry( new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20), TimeSpan.FromMinutes(1) },(ex, ts, i, context) =>{Console.WriteLine("出错");}); //重试3次,每次等待2秒 ISyncPolicy policy = Policy .Handle<Exception>() .WaitAndRetry(3, i => TimeSpan.FromSeconds(1)); //多次出错,断路保护 ISyncPolicy policyCir = Policy .Handle<Exception>().CircuitBreaker(2, TimeSpan.FromSeconds(5)); policy = policy.Wrap(policyCir); policy.Execute(() => { Console.WriteLine("任务开始"); throw new Exception("没有姓名参数"); });
未完待续...