Polly的多种弹性策略介绍和简单使用

什么是Polly?
Polly是一个.NET弹性和瞬态故障处理库.允许我们以非常顺畅和线程安全的方式来执行诸如行重试,断路,超时,故障恢复等策略。

Polly项目地址:https://github.com/App-vNext/Polly

Polly提供多种弹性策略:重试(Retry),断路器(Circuit-breaker),超时检测(Timeout),缓存(Cache),降级(FallBack)

重试(Retry):

前置条件:许多故障是短暂的,并且可能在短暂延迟后自我纠正
政策如何缓解:允许配置自动重试机制

断路器(Circuit-breaker):
前置条件:当系统繁忙时,快速响应失败比让用户一直等待更好,保护故障系统不受过载的影响可以帮助它恢复
政策如何缓解:故障超过某个预先配置的阈值时,阻塞执行一段时间。

超时检测(Timeout):
前置条件:超过一定的等待,成功的结果是不可能的
政策如何缓解:保证调用者不必等待超时

隔板隔离(Bulkhead Isolation):
前置条件:当进程发生故障时,备份的多个失败调用可以轻易地淹没主机中的资源(例如线程/ CPU)。故障下游系统还可能导致上游“备份”失败的呼叫,两者都有可能导致故障过程导致更广泛的系统崩溃
政策如何缓解:将受管理的操作限制在固定的资源池中,隔离它们影响其他资源的可能性

缓存(Cache):
前置条件:不经常更新的数据。
政策如何缓解:首次加载时,把响应数据进行缓存;如果缓存中存在,则从缓存中获取数据;

降级(FallBack):
前置条件:操作仍然会失败 - 当发生这种情况时你会做什么
政策如何缓解:定义在失败时返回的替代值(或要执行的操作)

策略包装(PolicyWrap):
前置条件:不同故障需要不同的策略; 弹性意味着使用组合
政策如何缓解:允许灵活组合上述任何策略

代码示例:

重试(Retry):

            //PollyException:此类文件是我自己定义的异常类
            //Policy policy = Policy.Handle<PollyException>().Retry();  //重试一次
            //Policy policy = Policy.Handle<PollyException>().Retry(10);//重试n次,本次是重试10次
            //Policy policy = Policy.Handle<PollyException>().Retry(10, (exception, retryCount, context) => //重试n次,在每次重试时调用下面代码
            //{
            //    //每次重试都会执行这里面的代码
            //    //做些操作
            //});
            //Policy policy = Policy.Handle<PollyException>().RetryForever();  //一直重试直到成功
            Policy policy = Policy.Handle<PollyException>().WaitAndRetry(new[]
              {
                TimeSpan.FromSeconds(1),//等待1秒重试一次
                TimeSpan.FromSeconds(2),//等待2秒重试一次
                TimeSpan.FromSeconds(3) //等待3秒重试一次
              });  //重试3次,每次持续等待时间分别为1秒,2秒,3秒
            try
            {
                policy.Execute(() =>
                {
                    Console.WriteLine("开始任务");
                    int s = new Random().Next(0, 100);
                    if (s % 3 != 0)
                    {
                        throw new PollyException("出错啦-" + s);
                    }
                    Console.WriteLine("完成任务" + s);
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

  

  

断路器(Circuit-breaker):

            ISyncPolicy policy = Policy.Handle<PollyException>().CircuitBreaker(6, TimeSpan.FromSeconds(10));
            while (true)
            {
                try
                {
                    policy.Execute(() =>
                    {
                        Console.WriteLine("开始执行");
                        int s = new Random().Next(0, 100);
                        if (s % 10 != 0)
                        {
                            throw new PollyException("出错啦-" + s);
                        }
                        Console.WriteLine("结束执行" + s);
                    });
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

                Thread.Sleep(1000);
            }//短路保护 出现了6次故障之后,直接给我们爆出了短路保护的异常,“The circuit is now open and is not allowing calls”

  请注意,断路器策略会重新抛出所有异常,甚至是已处理的异常。断路器用于测量故障并在发生太多故障时断开电路,但不会重新编排重试。根据需要将断路器与重试策略相结合。

策略包装(PolicyWrap):

可以把多个ISyncPolicy合并到一起执行
policy3= policy1.Wrap(policy2);
执行policy3就会把policy1、 policy2封装到一起执行

            Policy policyRetry = Policy.Handle<PollyException>().Retry(3);
            Policy policyFallback = Policy.Handle<PollyException>()
            .Fallback(() =>
            {
                Console.WriteLine("降级");
            });
            Policy policy = policyFallback.Wrap(policyRetry);
            policy.Execute(() =>
            {
                Console.WriteLine("开始任务");
                int s = new Random().Next(0, 100);
                if (s % 10 != 0)
                {
                    throw new PollyException("出错-" + s);
                }
                Console.WriteLine("完成任务-" + s);
            });//重试3次,还出错就降级

  

超时检测(Timeout):

            Policy policy = Policy.Handle<Exception>() //定义所处理的故障
            .Fallback(() =>
            {
                Console.WriteLine("执行出错");
            });
            policy = policy.Wrap(Policy.Timeout(2, TimeoutStrategy.Pessimistic));
            policy.Execute(() =>
            {
                Console.WriteLine("开始任务");
                Thread.Sleep(5000);
                Console.WriteLine("完成任务");
            });

 超时处理不能简单的链式调用 ,要用到Wrap()

降级(FallBack):

           //如果正常业务代码出现异常,则执行降级业务代码
            Action fallbackAction = () =>
            {
                //执行降级业务代码
                Console.WriteLine("执行出错-降级");
            };
            Policy policy = Policy.Handle<PollyException>()
            .Fallback(fallbackAction);
            policy.Execute(() =>
            {
                //正常业务代码
                Console.WriteLine("开始任务");
                int s = new Random().Next(0, 100);
                if (s % 3 != 0)
                {
                    throw new PollyException("出错啦-" + s);
                }
                Console.WriteLine("完成任务" + s);
            });

 缓存(Cache):

 隔板隔离(Bulkhead Isolation):

 

原文地址:https://www.cnblogs.com/jiumei1/p/9340408.html

时间: 2024-10-09 12:42:45

Polly的多种弹性策略介绍和简单使用的相关文章

进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢.所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量.所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来

Android反编译工具介绍与简单实用方法

Android反编译工具介绍与简单实用方法 Android反编译的目的无非就是为了看到APK的xml.资源和代码: 得到代码的方式:直接解压APK文件 --> 得到classes.dex文件 --> 使用 dex2jar classes.dex classes.jar生成jar文件 --> [可选的解压jar文件] -->使用XJad或者JDCompiler查看源代码 得到XML的方式: 方式1:直接解压APK文件 --> 通过axmlprinter工具查看XML文件(这种方

设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式   策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1.组成 -抽象策略角色: 策略类,通常由一个接口或者抽象类实现. -具体策略角色:包装了相关的算法和行为. -环境角色:持有一个策略类的引用,最终给客户端调用. 2.应用场景 - 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. -需要在不同情况下使用不同的策略(算法),或者策略还可能在未来

C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

原文:C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍 在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一印象,我们要规划好这些菜单的内容,布局等信息.根据微信菜单的定义,我们可以看到,一般菜单主要分为两种,一种是普通的Url菜单(类型为View的菜单),一种是事件菜单(类型为Click的菜单),一般情况下,微信的Url菜单,是无法获得用户的任何信息的,但微信用户信息非常重要,因此也提供了另外一种方式(类似重定向的方式)来给我们使用,本篇

Hive优化策略介绍

作为企业Hadoop应用的核心产品之一,Hive承载着公司95%以上的离线统计,甚至很多企业里的离线统计全由Hive完成: Hive在企业云计算平台发挥的作用和影响越来越大,如何优化提速已经显得至关重要: Hive作业的规模决定着优化层级,一个Hive作业的优化和一万个Hive作业的优化截然不同: 后续文章将从如下三个方面进行hive的优化介绍: 1)  架构方面(高效.全局.局部)----最有效的优化,好的架构能让作业性能提高很多 a)  分表:(日志表量大而且作业访问次数多,造成耗时较长:将

玩转web之servlet(六)---session介绍及简单使用(登录验证中保存信息)

在浏览器与服务器进行交互时,往往需要把涉及到的一些数据保存下来,这时就需要使用cookie或session进行状态管理. 这篇文章先来说说session怎么用,首先在servlet中创建一个session来保存信息,举个例子,在做登陆验证时,如果登陆成功,需要将用户的信息保存到session中,怎么保存呢?下面给出代码: public class Login_Do extends HttpServlet { String order_name = ""; String order_pa

设计模式之策略模式&amp;amp;简单工厂模式

学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解.非常难看懂的代码一眼就能够看懂了,趁着有点感觉了.早点收获吧. 简单工厂模式: 简单地说简单工厂模式:非常easy变化的地方,就能够用到简单工厂模式. 实例: 举个样例:我们在逛商场时.正好商场促销,各种优惠活动:有满300返100 ,有打8折的.抽奖等等吧. 促销来讲,各种优惠活动事实上就是变化.

Json.Net的介绍与简单实用(兼容2.0/3.0/3.5/4.5/RT)

本文的前提是你已经熟悉Json,如果您还不知道什么是Json是什么,请自行查看维基百科. 一.Json.Net是什么? Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的.Net对象.让你轻松实现.Net中所有类型(对象,基本数据类型 等)和Json的转换. 二.为什么使用Json.Net? 我们知道在.Net中内置了读写Json

(三)AJAX基本介绍和简单实例03

AJAX基本介绍和简单实例03-----Ajax与数据库的动态应用 初始界面: 选择所有用户后显示的界面: 查询姓名为杜森的客户,结果如下: Demo03.html代码如下: <html> <meta http-equiv="content-type" content="text/html" charset="utf-8"/> <head> <style> body { background:#CC