zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    【转】手动写一个Behavior Designer任务节点
    【转】BehaviorDesigner学习
    Behavior trees for AI: How they work
    【转】behave行为树学习使用第一天
    【转】写给笨人的法线贴图原理
    【转】如何把Json格式字符写进text文件中
    【转】系列化与反系列化
    【转】C#中将JSon数据转换成实体类,将实体类转换成Json
    【转】c#处理3种json数据的实例
    【转】Mecanim Animator使用详解
  • 原文地址:https://www.cnblogs.com/Adoni/p/12336610.html
Copyright © 2011-2022 走看看