c# polly学习

最近在项目当中使用到了开源项目polly的异常重试策略,在使用当中发现polly是个功能很强大的项目,

于是对其提供的几种策略进行学习.

polly的github地址为:https://github.com/App-vNext/Polly

关于polly

polly文档中对自己介绍的原文是:

Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry,

Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

从这段话我们可以知道polly项目是一个基于.NET开发的用来处理瞬故障的库,我们可以借助这个库以线程安全的形式实现

重试、断路、超时、隔离和回退策略.

Polly七大策略

Polly的使用方式是在Nuget中下载安装包 Polly,安装成功即可使用

1.重试策略

异常重试是最常使用的一个策略,其功能是当我们执行的方法体发生异常时,可以按照我们指定的次数进行重试

           Policy
          .Handle<NullReferenceException>()   //指定需要重试的异常类型
          .Retry(2,(ex,count,context)=> {     //指定发生异常重试的次数
              Console.WriteLine($"重试次数{count},异常{ex.Message}");
          })
          .Execute(() => Console.Write("execute method!"));    //要执行的方法

如上代码所示,异常重试的使用支持链式编程,且使用方式分为三个步骤:

(1) 指定需要处理的异常

可以指定捕获执行的任务的异常类型,若执行任务的异常类型满足指定异常,那么重试机制将会生效

(2)指定重试次数和监控重试

指定整个执行过程中需要重试多少次,且可以监控每次的重试信息,比如重试次数  异常以及重试的上下文信息

(3)指定执行的任务

指定执行的任务是整个异常重试的核心和监控对象,Execute支持多种重载,也可以使用ExecuteAsync支持异步

任务执行.

后续会对重试的用法和实现进行详细的分析.

2.超时策略

超时策略主要用于对任务执行的执行时长监控,若任务执行超出指定执行时长,那么我们就认为这次任务执行是失败的,

不会再去等待结果

            Policy
            .Timeout(10, (context, timeSpan, task) =>
           {
                Console.WriteLine("1");
            });

3.熔断策略

熔断在这里的含义在执行某个任务时,多次重试依然出现超时或则异常,且重试的次数已经超过了系统设定上限.

那么就中断当前的执行,快速响应失败信息给用户,等待一段时间再进行恢复,继续执行.

var breakerPlocy = Policy.Handle<Exception>()     //指定异常
                         .CircuitBreaker(5, TimeSpan.FromSeconds(30),               //设置5次阀值,中断30秒
                         onBreak: (ex, timeSpan) => { Console.WriteLine("onBreak"); }, //中断回调
                         onReset: () => { Console.WriteLine("onReset"); });            //重置回调

熔断的基本策略设置如上代码所示,上面的代码可以解析为当某个任务超过5次异常时,我们进行中断处理,等待30秒后再次继续.我们设置了

中断回调和重启回调函数,可以记录当中的执行信息.

4.回退策略

回退策略的前置条件是当我们的操作注定会失败时,我们就需要有一个合理的返回信息来替代失败信息,也就是提供一个备用方案,

从而能对我们的失败操作进行挽救.

     Policy
        .Handle<Exception>()
        .Fallback(fallbackAction: () => { }, onFallback: (ex) => { });           

回退策略的基本设置如上所示,我们可以定义备用的返回信息,同时可以定义回调

5.隔板隔离策略

隔板隔离的前置条件是当进程出现故障时,多个失败一直在主机中对资源一直占用。下游系统故障也可能导致上游系统的故障,

这些风险都可能导致系统产生严重的后果.而隔板隔离策略可以隔离有相互影响的操作,将受管制的草需哦限制在一个固定的资源池中

            Policy.Bulkhead(10, 15, (context) => { });

指定最大的线程数,和正在排队的队列数,若执行被拒绝,则执行回调.

6.缓存策略

缓存策略的前置条件是我们的数据更新周期较长且使用频繁,我们可以首次加载这些数据时将这些数据缓存起来,

如果数据已经存在那么我们直接从缓存中读取.

缓存策略在某些情况下简化我们的缓存实现是很有帮助的.

后续会对缓存策略的实现和用法进行详细的分析.

7.策略包装策略

策略包装策略的前置条件是不同的异常需要不同的策略,也就是需要我们弹性的使用策略来应对不同的异常信息.

未完,待续

原文地址:https://www.cnblogs.com/xxue/p/9886394.html

时间: 2024-11-10 20:54:34

c# polly学习的相关文章

青年节坚持人工智能服务与深度学习

五月主题 | 人工智能 5月2日 | 亚马逊人工智能服务与深度学习平台概览 演讲嘉宾:张侠,AWS首席云计算企业顾问 5月9日 | Amazon Rekognition 陈琳涛,AWS解决方案架构师 5月16日 | 利用 Amazon Lex 轻松构建语音文本会话应用 赵霏, AWS解决方案架构师 5月23日 | 基于Apache MXNet快速构建深度学习平台 张江山, AWS解决方案架构师 2017年的5月2日 主题聚焦新智云(www.enncloud.cn) 亚马逊人工智能服务与深度学习平

零基础学习python_字符串(14-15课)

今天回顾下我之前学习python的第一个对象--字符串,这个对象真蛋疼,因为方法是最多的,也是最常见的类型,没有之一... 内容有点多,我就搜了下网上的资料,转载下这个看起来还不错的网址吧:http://www.cnblogs.com/PeterZhang1520389703/p/7647160.html str.capitalize() --> String 返回字符串,其首字母大写,其余部分小写 1>>> str = "TEST" 2>>>

使用 Polly 实现复杂策略(超时重试)

一.背景 第一次接触 Polly 还是在做某个微服务系统的时候,那时只会使用单一的超时策略与重试策略,更加高级的特性就没有再进行学习了.最近开为某个客户开发 PC 端的上位机的时候,客户有个需求,在发起请求之后如果 5 秒钟没有响应则进行重试,总共可以重试 3 次,如果 3 次请求都未返回数据,就视为请求失败. 关于 Polly 的高级用法可以参考官方的 Wiki 文档即可,国内也有很多优秀的介绍文章,例如 这篇 和 这篇. 二.思路 查阅了 Polly 的官方文档之后,发现 Polly 提供了

IdentityServer4学习记录

前言 .NetCore 生态伴随着各位大神的推广,好多小伙伴都学习或应用到现有项目中了:  同时,很多相关组件也提上了学习之旅,如IdentitiServer4.Polly.Ocelot.Consul等:这篇本来想记录一下IdentitiServer4的学习记录的,但是突然发现一篇博文记录的很详细,所以就借用他的地址,因为和我想记录的视频是一样的. IdentityServer4 学习记录 之前我也看过很多相关的博客,和一些视频,但讲解的让人感觉理解的不是那么容易:下面视频真的很不错,讲解思路和

Vue.js学习笔记:属性绑定 v-bind

v-bind  主要用于属性绑定,Vue官方提供了一个简写方式 :bind,例如: <!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩写 --> <a :href="url"></a> 绑定HTML Class 一.对象语法: 我们可以给v-bind:class 一个对象,以动态地切换class.注意:v-bind:class指令可以与普通的class特

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

微信小程序学习总结(2)------- 之for循环,绑定点击事件

最近公司有小程序的项目,本人有幸参与其中,一个项目做下来感觉受益匪浅,与大家做下分享,欢迎沟通交流互相学习. 先说一下此次项目本人体会较深的几个关键点:微信地图.用户静默授权.用户弹窗授权.微信充值等等. 言归正传,今天分享我遇到的关于wx:for循环绑定数据的一个tips:  1. 想必大家的都知道wx:for,如下就不用我啰嗦了: <view class="myNew" wx:for="{{list}}">{{item.title}}<view

【安全牛学习笔记】

弱点扫描 ╋━━━━━━━━━━━━━━━━━━━━╋ ┃发现弱点                                ┃ ┃发现漏洞                                ┃ ┃  基于端口五福扫描结果版本信息(速度慢)┃ ┃  搜索已公开的漏洞数据库(数量大)      ┃ ┃  使用弱点扫描器实现漏洞管理            ┃ ╋━━━━━━━━━━━━━━━━━━━━╋ [email protected]:~# searchsploit Usage:

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys