熔断 降级(polly)

https://www.cnblogs.com/szlblog/p/9300845.html1、熔断降级的概念:

    熔断:我这里有一根长度一米的钢铁,钢铁的熔点1000度(假设),现在我想用力把这根钢铁折弯,但是人的力有限达不到折弯的点,然后我使用火给钢铁加热,每隔一段时间我就会尝试一下是否能折弯,在这个过程中我发现,随着不断的煅烧,折弯钢铁是花费的力气越小,在这个过程出现了意外因为我的疏忽,温度超过了钢铁的熔点了,导致一根变成的两根,和我最初的目的相违背了,早知道当初我装个报警的装置了还可以提想我。

  如果在这个例子中我们把一根钢铁换成我们程序中的接口(接口能同时承受1000的访问),然后把火替换成我们的接口调用者,当接口的并发超过1000这个点的时候接口将会挂掉,作为调用者并不能控制这个点,当并发量上来的时候导致接口蹦了,为了防止我们的接口发生崩溃的情况,我们做一个报警的设置,当发生这个情况的时候占时切断服务,防止服务崩溃。

   降级:接着上一个例子:既然这个钢铁因为一个意外导致变成两个,不能进行使用了,我变找了一个绳子替代一下。

当我们的服务接口发生错误的时候,我们可以找到一个替代方法进行使用。这个方法可能是启用另一台服务器的接口,也可能是只返回“”服务器繁忙请重试的提示“”。总之不会把一个系统级别的问题暴露给用户,让使用者的程序也出现问题。

2、Polly的7中策略

    处理熔断降级的框架本人所知 有NetFlix的Hystrix框架和Polly框架我们将使用Polly进行熔断降级处理。

    Polly的概念:Polly是一个被.net基金会支持认可的框架,Polly是一个.NET弹性和瞬态故障处理库,允许开发人员以流畅和线程安全的方式表达策略,如重试、断路器、超时、舱壁隔离和回退。

    Polly的7种策略:官方文档是这么说的:

    1、重试(Retry):当程序发生短暂的故障、并且故障在延迟后,可以自动纠正的,前期是暂时的我们可以配置自动重试。

    2、断路器(Circuit-Breaker):当一个系统陷入严重的问题时,让系统快速的失败,比让用户一直等待着要好的多,保护一个系统不受过载的影响,可以帮助它快速的恢复。

    3、超时(Timeout):在等待一定的时间后,没有返回相应的结果,保证程序不会一直等待下去,使调用者不必一直的等待下去。

    4、隔离(Bulkhead Isolation):当进程出现故障的时,一台主机中的多个失败的进程,对资源(例如线程/CPU)的一直占用,当下游的系统发生故障的时候,也可能导致上游对资源的调用失败、这两种风险的出现都将导致更大范围的影响、隔离策略是为了防止“一个点的失败导致整盘的失败”把受到管理的操作固定在某个资源中,避免影响到其他的资源。

    5、缓存(Cache):针对相同的请求,在第一次访问的时候将响应的数据进行缓存,再次访问的时候直接在缓存中提供响应的数据。

    6、回退(FallBack):当程序发生失败的情况的时候,我们将做些什么,定义一个在程序发生失败的时候要执行的动作。

    7、策略组合(PolicyWrap):Polly针对不同的故障有不同的策略,我们可以灵活的组合策略,上述的六种策略可以灵活组合使用。

3、Polly的基本用法

    因为Polly对NetCore的友好支持,下面我们将使用Core的控制台对Polly的几种策略进行简单的演示

    首先创建控制台程序

    

    在Nuget的控制台中使用 Install-Package Polly 命令进行安装

    注意:在创建项目的时候命名尽量不要使用Polly命名

    Polly 每个版本的介绍 https://www.nuget.org/packages/Polly/

    执行命令进行安装如下图所示

    

    首先我们要学会并且指定希望Policy 处理的异常:

   

复制代码

1 /*

2 *指定Policy希望策略处理的异常/错误

3 * 这里只是制定Policy 处理异常的方案不做任何的处理

4 */

5

6 //单个不加对异常加条件

7 Policy.Handle();

8

9 //单个对处理的异常加上条件 这里的条件指明了当异常的 HResult 值为 -2146233088 时处理异常

10 Policy.Handle(ex => ex.HResult == -2146233088);

11

12 //多个使用Or即可 多个不加条件

13 Policy.Handle().

14 Or();

15

16 //多个加条件

17 Policy.Handle(ex => ex.HResult == 00000000).

18 Or(ex => ex.HResult == 00000000);

19

20 //多个混合加条件

21 Policy.Handle().

22 Or(ex => ex.HResult == 00000000).

23 Or(ex => ex.HResult == 00000000).

24 Or();

复制代码

    下面我们指定一个希望Policy处理的异常,并且完成调用

    

复制代码

1 /*

2 *指定Policy 处理的异常/错误为 错误的基类 Exception 并且给异常加上条件

3 *如果条件不满足则不做任何处理

4 * 不作处理程序将会报错

5

6 var PolicyExecute = Policy.Handle(ex => ex.HResult == -2146233088).Fallback(() =>//动作

7 {

8 Console.WriteLine($"执行出错监控的异常为:Exception 异常 HResult值为:-2146233088 ");

9 //Console.WriteLine($"执行出错监控的异常为:ArgumentException 异常 HResult值为:-2147024809 ");

10 });

11

12 //执行

13 PolicyExecute.Execute(() =>

14 {

15 Console.WriteLine("开始执行程序******");

16 //直接抛出异常(Exception) HResult值为 -2146233088

17 throw new Exception();

18 //throw new ArgumentException();

19 }

20 );

21 */

复制代码

    因为throw new Exception();的 HResult 的值为

    如图所示

    

     执行结果为:

    

    当我们使用throw new ArgumentException(); 时 它的HResult 的值为

    如图所示:

    

    

    执行结果为:

    因为我们没有做任何的处理所以程序直接报错

    

    上面演示了Policy的基本用法

4、Polly7种策略的使用

    1、重试策略(Retry):

    

复制代码

1 /* Policy的重试策略 Retry

2 * 如果程序发生错误将重新执行 3 次

3 int Count = 0;

4 var PolicyExecutes =

5 Policy.Handle(ex => ex.HResult == -2146233088)

6 .Retry(3, (ex, Index) => {

7 Console.WriteLine($"执行出错监控的异常为:Exception 异常 HResult值为:-2146233088 ");

8 Console.WriteLine($"第{Index}次 Retry(重试)");

9 }

10 ).Execute(() =>

11 {

12 Console.WriteLine("开始执行程序");

13 Count = Count + 1;

14 if (Count > 3)

15 {

16 Console.WriteLine("执行成功");

17 Console.WriteLine("
结束执行程序************");

18 return "";

19 }

20 else

21 {

22 throw new Exception();

23 }

24

25 });

26 */

复制代码

    执行结果:

    

    2、断路器(Circuit-Breaker)

     

复制代码

1 /******************************************************************************************************/

2 /
Policy的断路器策略 Circuit-Breaker

3 * 程序首次被访问如果连续出现三次错误后,将暂停3秒,三秒结束后 可以被继续访问

4 * 继续访问时 如果第一次就出现错误 继续熔断

5

6

7 var PolicyExecutes =

8 Policy.Handle()

9 .CircuitBreaker(3, TimeSpan.FromSeconds(3));

10

11 //模拟访问十次

12 for (int i = 0; i < 10; i++)

13 {

14 try

15 {

16 PolicyExecutes.Execute(() =>

17 {

18 Console.WriteLine("开始执行程序******");

19 throw new Exception("异常");

20 });

21 }

22 catch (Exception ex)

23 {

24 Console.WriteLine($"Exception信息{i}" + ex.Message);

25 }

26 //一秒运行一次

27 Thread.Sleep(1000);

28 }

29 */

复制代码

    执行结果:

    

    3、 超时策略(Timeout)

复制代码

1 /*Policy的超时策略(Timeout)

2 * 程序本身没有错误就是执行的时间超过了我们制定的超时策略的时间然后程序就抓捕到超时的异常

3

4 try

5 {

6 //超时策略

7 Policy policy = Policy.Timeout(3, TimeoutStrategy.Pessimistic);

8

9 policy.Execute(() =>

10 {

11 Console.WriteLine("开始执行程序******");

12 Thread.Sleep(5000);

13 });

14 }

15 catch (Exception ex)

16 {

17 Console.WriteLine(ex.Message);

18 }

19 */

复制代码

    执行结果:

    

    4、隔离策略(Bulkhead Isolation)

复制代码

1 /*Policy的隔离策略(Bulkhead Isolation)

2 *

3 //制定策略最大的并发数为5

4 Policy PolicyExecutes = Policy.Bulkhead(5);

5 //程序运行6次 总会有一个失败的,但是这个失败的不会影响其他5个的执行结果

6 for (int i = 0; i < 6; i++)

7 {

8 Task.Factory.StartNew(() =>

9 {

10 try

11 {

12 PolicyExecutes.Execute(() =>

13 {

14 Console.WriteLine($"开始执行程序******");

15 });

16 }

17 catch (Exception ex)

18 {

19 Console.WriteLine(ex.Message);

20 }

21 });

22 }

23 */

复制代码

    执行结果:

    

    5、缓存策略(Cache):

     

复制代码

1 /*Policy 缓存策略(Cache)

2 * 控制台不方便演示

3 * Policy.Cache 可以指定 过期时间,绝对过期时间,滑动过期时间等

4

5 //Policy 的缓存策略的制定

6 MemoryCache memoryCache = null;

7 var PolicyExecutes = Policy.Cache(memoryCache, TimeSpan.FromMinutes(5));

8 */

复制代码

    6、 回退(FallBack)

    

复制代码

1 /*Pollcy 的回退策略(FallBack)

2 * FallBack 当主程序发生错误是我们启动备用的程序进行程序处理

3

4 var PolicyExecute = Policy.Handle().Fallback(() =>

5 {

6 Console.WriteLine($"你的程序报错了,我是替代程序!");

7

8 });

9

10 //执行

11 PolicyExecute.Execute(() =>

12 {

13 Console.WriteLine("开始执行程序******");

14 throw new Exception();

15 }

16 );

17 */

复制代码

    执行结果:

    

    7、策略组合(PolicyWrap)

     PolicyWrap的上面六种策略可以任意的组合起来使用:我们将超时策略(Timeout)加上回退(FallBack)策略组合使用

     

复制代码

1 //Fallback策略

2 Policy PolicyExecute = Policy.Handle().Fallback(() =>

3 {

4 Console.WriteLine($"你的程序超时了,我是替代程序!");

5

6 });

7 //超时策略

8 PolicyExecute = PolicyExecute.Wrap(Policy.Timeout(3, TimeoutStrategy.Pessimistic));

9 //执行

10 PolicyExecute.Execute(() =>

11 {

12 Thread.Sleep(5000);

13 }

14 );

复制代码

    执行结果:

    

    

      OK

      这些只是简单的演示,官方文档更加详细。

下一篇我们是使用 Aop 基于 AspNetCore 的过滤器 实现一下Policy 的使用。

熔断 降级(polly)的更多相关文章

  1. 使用.NetCore 控制台演示 熔断 降级(polly)

    1.熔断降级的概念: 熔断:我这里有一根长度一米的钢铁,钢铁的熔点1000度(假设),现在我想用力把这根钢铁折弯,但是人的力有限达不到折弯的点,然后我使用火给钢铁加热,每隔一段时间我就会尝试一下是否能 ...

  2. ASP.NET Core 微服务初探[2]:熔断降级之Polly

    当我们从单体架构迁移到微服务模式时,其中一个比较大的变化就是模块(业务,服务等)间的调用方式.在以前,一个业务流程的执行在一个进程中就完成了,但是在微服务模式下可能会分散到2到10个,甚至更多的机器( ...

  3. (5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)

    一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...

  4. (5).NET CORE微服务 Micro-Service ---- 熔断降级(Polly)

    一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...

  5. 熔断降级(Polly)

    熔断降级(Polly) https://www.cnblogs.com/qhbm/p/9224307.html 一. 什么是熔断降级 熔断就是"保险丝".当出现某些状况时,切断服务 ...

  6. asp.net core 使用HttpClientFactory Polly实现熔断降级

    前言 在++NET Core2.1++后也是增加更新了很多东西,当然HttpClientFactory更新中的一部分.虽然说HttpClient这个实现了disposable,但使用它的时候用usin ...

  7. 用HttpClientFactory来实现简单的熔断降级

    前言 在2.1之后,有不少新东西,其中HttpClientFactory算是一个.HttpClientFactory涉及的东西也不算少,三四种clients , 请求中间件,与Polly的结合,生命周 ...

  8. .NET熔断之Polly

    1. Net Core 中有一个被.Net 基金会认可的库 Polly,可以用来简化熔断降级的处理.主要功能:重试(Retry):断路器(Circuit-breaker):超时检测(Timeout): ...

  9. 简易RPC框架-熔断降级机制

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

随机推荐

  1. Linux_配置_02_配置dns

    二.参考资料 1.centOS 7 设置DNS方法 同之前版本不同

  2. python程序打包工具 ── cx_Freeze

    cx_Freeze是一个类似py2exe的工具,它们区别是py2exe是将python程序打包成windows下可以执行的exe文件的,而cx_Freeze则是将python程序打包为linux下可以 ...

  3. 「LuoguP1725」琪露诺(dp 单调队列

    题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河岸去追 ...

  4. WC2017 冬眠记

    2017年2月3日,为期7天的冬眠营冬令营正式开幕. 前4天我们见到了各种集训队dalao们的华丽身姿 感受到了听课听不懂睡觉又惭愧的无力感 见到了几百号人近一半玩手机,剩下的一半有一半在睡觉,再剩下 ...

  5. jQuery之简单的表单验证

    html部分: <body> <form method="post" action=""> <div class="in ...

  6. python基础知识-列表,元组,字典

    列表(list) 赋值方法: l = [11,45,67,34,89,23] l = list() 列表的方法: #!/usr/bin/env python class list(object): & ...

  7. 五 akka streams kafka

    (转载 https://doc.akka.io/docs/akka-stream-kafka/current/home.html) 一: Akka Streams Kafka, also known ...

  8. ipv4 ipv6简介

    互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(IP Address),在Internet上,一种给主机编址的方式.常见的IP地址,分为 ...

  9. Biopython常用功能模块

    Biopython项目是旨在减少计算生物学中代码重复的开源项目之一,由国际开发人员协会创建. 它包含表示生物序列和序列注释的类,并且能够读取和写入各种文件格式(FASTA,FASTQ,GenBank和 ...

  10. openstack官方指导书

    openstack官方网站:https://docs.openstack.org/ 由于openstack的官方文档有点多,所以这里对其进行梳理一下 Release Notes 发布版本 新功能,升级 ...