c# 弹性和瞬态故障处理库Polly 学习

关于Polly

                                                                    640?wx_fmt=png

 

   Polly是一个基于.NET的弹性及瞬态故障处理库,允许开发人员以顺畅及线程安全的方式执行重试(Retry)、断路(Circuit Breaker)、超时(Timeout)

     隔离(Bulkhead Isolation)和回退策略(Fallback ).Polly适用于 .NET 4.0, .NET 4.5 和.NET Standard 1.1。

     以上是官方文档对polly库的介绍。

     polly的介绍中有个很关键的词是瞬态故障,这个词也很好的诠释了Polly使用的一个背景.瞬态故障,就是指我们的程序在运行当中可能会发生故障,

     这些故障包含程序运行中的异常、返回结果不符等。弹性是指Polly在应对这些故障时具有灵活性,且其提供的策略也可以很灵活的组合在一起使用。

Polly的使用

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

                  Install-Package Polly

     方式2:在github中下载Polly源码

                 https://github.com/App-vNext/Polly

Polly策略

 

   一、重试(Retry)

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


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

    Polly的所有策略使用都支持链式调用。

      Polly重试策略的使用分为三个步骤

   1、指定需要处理的异常

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

     2、指定重试次数和监控重试

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

   3、指定执行的任务

        指定执行的任务是整个异常重试的核心和监控对象,Execute支持多种重载.。

          重试策略支持异步任务      

public async Task PollyStudy()

        {

            int num = await Policy

                .Handle<Exception>()

                .RetryAsync(2, (ex, count, context) =>

                {

                    Console.WriteLine($"重试次数{count},异常{ex.Message}");

                })

                .ExecuteAsync<int>(() =>

                {

                    return GetNum();

                });

        }


        public async Task<int> GetNum()

        {

            await Task.Delay(10000);

            return 1;

        }

  二、超时(Timeout) 

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

      不会再去等待结果

       超时策略最基本的设置:

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

   三、熔断(Circuit-breaker    

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

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


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

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

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

  四、回退(Fallback)

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

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


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

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

   五、隔板隔离策略

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

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

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

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

 六、缓存策略

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

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


ISyncCacheProvider cacheProvider = new StubCacheProvider();
            Func<Context, string> cacheKeyStrategy = null;
            Action action = () => Policy.Cache(cacheProvider, TimeSpan.MaxValue, cacheKeyStrategy);

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

七、策略包装策略

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


NoOpPolicy policy0 = Policy.NoOp();
           NoOpPolicy policy1 = Policy.NoOp();
           NoOpPolicy policy2 = Policy.NoOp();
           PolicyWrap policyWrap = Policy.Wrap(policy0, policy1, policy2);

  

总结

  上面简单介绍了polly七大策略和其基本配置,Polly实际功能很强大,是一个很值得仔细学习的库.

  后面会详细介绍Polly的几大策略以及在实际项目中的一个应用

相关文章:

  • .NET 开源项目 Polly 介绍

  • HttpClientFactory系列二:集成Polly处理瞬态故障

  • 在 .NET Core 中结合 HttpClientFactory 使用 Polly(上篇)

  • 在 .NET Core 中结合 HttpClientFactory 使用 Polly(中篇)

  • 在 .NET Core 中结合 HttpClientFactory 使用 Polly(下篇)

  • AspNetCore 基于AOP实现Polly的使用

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

  • .NET Core微服务之基于Polly+AspectCore实现熔断与降级机制

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


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF444C-DZY Loves Colors【线段树,set】

正题 题目链接:https://www.luogu.com.cn/problem/CF444C 题目大意 nnn个物品第iii个颜色为iii&#xff0c;权值为000。要求支持mmm次操作 给出l,r,xl,r,xl,r,x&#xff0c;对于所有区间[l,r][l,r][l,r]中的物品&#xff0c;如果颜色为ccc&#xff0c;那么该位置的权值加上∣…

codeforces1473 E.Minimum Path(分层图最短路)

E - Minimum Path 分层图最短路 第一个分层图 第0层就是按照题中给的点连边&#xff0c;从第0层到第1层我们连一条边权是0的边&#xff0c;从第1层到第2层连一条边权是原先边权2倍的边&#xff0c;当然第1层以及第2层之间按照原图连边。 第二个分层图 第0层就是按照题中给的点…

【博弈】取石子游戏(P2599)

正题 P2599 题目大意 给n堆石子&#xff0c;第 i 堆有 aia_iai​ 个石子&#xff0c;每次可以从最左边或者最右边的一堆里面取若干个&#xff0c;两个人轮流取&#xff0c;问先手是否存在必胜策略 解题思路 设 li,jl_{i,j}li,j​ 为在 [i,j][i,j][i,j] 右边添加一堆大小 li,…

2020牛客国庆集训派对day8

牛客网链接 文章目录Easy Chess题意&#xff1a;题解&#xff1a;Easy Problemset题意题解&#xff1a;Shuffle Cards题解&#xff1a;Diff-prime Pairs题意题解&#xff1a;代码&#xff1a;Easy Chess 题意&#xff1a; 通过n步从左下角走到右上角&#xff0c;每次移动都是…

TechEmpower最新一轮的性能测试出炉,ASP.NET Core依旧表现不俗

TechEmpower在10月30发布最新一轮&#xff08;Round 17&#xff09;针对“Web Framework Benchmarks”的性能测试报告&#xff0c;ASP.NET Core依旧表现不俗&#xff0c;在一些指标上甚至是碾压其他主流Web框架。为此我们做了一个简单的统计&#xff0c;看看ASP.NET Core和其他…

P6076-[JSOI2015]染色问题【组合数学,容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P6076 题目大意 给出n∗mn*mn∗m的网格&#xff0c;ccc种颜色涂色要求 每个格子可以染色也可以不染每一行每一列至少有一个格子被染每个颜色至少用一次 1≤n,m,c≤4001\leq n,m,c\leq 4001≤n,m,c≤400 解题思路 一个比较简…

E - Escape from the Island(最短路+dp)

E - Escape from the Island 大佬题解&#xff0c;码风真的爱了 状态表式&#xff1a;f(u,j)f(u,j)f(u,j)当前在uuu点&#xff0c;已经划了jjj步时离终点的最短距离 状态转移&#xff1a; 主动划一步min&#xff0c;转移到下一个点vvv f(u,j)f(v,j1)1,(u,v)∈E,(u,v)∈Ef(u,j…

国内开源社区巨作AspectCore-Framework入门

前些天和张队(善友),lemon(浩洋),斌哥(项斌)等MVP大咖一块儿吃饭,大家聊到了lemon名下的AOP这个项目,我这小白听得一脸懵逼,后面回来做了一下功课,查了下资料,在lemon的Github上把这个项目学习了一下,收获颇丰,让我这个没有接触过AOP的Coder叹为观止,陷入了对lemon的深深崇拜,在…

【数论】Product(P5221)

正题 P5221 题目大意 求 ∏i1n∏j1nlcm(i,j)gcd(i,j)\prod_{i1}^n\prod_{j1}^n\frac{lcm(i,j)}{gcd(i,j)}i1∏n​j1∏n​gcd(i,j)lcm(i,j)​ 解题思路 ∏i1n∏j1nlcm(i,j)gcd(i,j)\prod_{i1}^n\prod_{j1}^n\frac{lcm(i,j)}{gcd(i,j)}i1∏n​j1∏n​gcd(i,j)lcm(i,j)​ ∏i1n∏…

STL的可持久化数组

rope是一种可持久化数组&#xff0c;可持久化平衡树&#xff0c;采用块状链表实现 #include<ext/rope> using namespace __gnu_cxx; rope<int>a;rope就是一个用可持久化平衡树实现的“重型”string 库中模板计算基本和string一样简单 各种操作的复杂度都是O(log…

HarmonyOs4.0基础(一)

目录 一、HarmonyOs系统定义 1.1系统的技术特性(三大特征) 1.1.1、硬件互助、资源共享 1.1.2、一次开发、多端部署(面向开发者) 1.1.3、统一OS&#xff0c;弹性部署(支持多种API&#xff1a;ArkTs、JS、C/C、Java) 1.2、系统的技术架构 二、Harmony OS项目搭建 2.1、(D…

P4643-[国家集训队]阿狸和桃子的游戏【结论】

正题 题目链接:https://www.luogu.com.cn/problem/P4643 题目大意 给出nnn个点mmm条边的无向图&#xff0c;两个人轮流选择一个未被选择的点加入点集。 然后每个人的权值为选出的点的导出子图点权加边权和。 两个人都希望自己的权值减去对方的权值最大 求先手的权值减去后…

C. Code a Trie(Trie+dfs+贪心)

C. Code a Trie 大佬题解&#xff0c;代码基本就是抄的 对于每一个值计算所有串的LCA&#xff0c;也就是最长公共前缀&#xff0c;将该节点&#xff08;Trie树的节点&#xff09;标记&#xff0c;对于这些字符串在LCA下面的点一定不存在&#xff08;如果存在他们不会返回相同…

swagger文档转换为WebApiClient声明式代码

1 swagger简介Swagger是一个规范且完整的框架&#xff0c;提供描述、生产、消费和可视化RESTful Web Service。其核心是使用json来规范描述RESTful接口&#xff0c;另外有提供UI来查看接口说明&#xff0c;并有一套生成不同语言的客户端调用代码生成器。1.1 对Api提供者自顶向下…

Musical Theme pku1743 (后缀数组)

Musical Theme(后缀数组) 题意&#xff1a; n个数&#xff0c;选取一段子序列&#xff0c;满足以下条件&#xff1a; 1.长度至少为5 2.在数列中其他位置出现过(允许转置) 3.与其他位置出现的不重叠 转置&#xff1a;将恒定的正或负值添加到子序列上 例如&#xff1a; n个数为…

各种有用的东西留言板

目录各种链接各种OJ各种有用网站模拟赛排名表格制作其他STLO2优化&#xff1a;快读fread黑科技各种链接 各种OJ ssl 洛谷 纪中 牛客 PTA Vijos JoyOI 51Nod 大视野 ssl比赛 NOI.AC AcWing USACO CodeVS 北京大学 浙江大学 Comet OJ 杭州电子科技大学 《算法竞赛进阶指南》题库…

P3180-[HAOI2016]地图【圆方树,莫队,分块】

正题 题目链接:https://www.luogu.com.cn/problem/P3180 题目大意 nnn个点mmm条边的一个仙人掌&#xff0c;有点权。 QQQ次询问给出op,x,yop,x,yop,x,y&#xff0c;封闭111到xxx号点的所有简单路径后xxx能到达的点的点权中&#xff0c;小于yyy且出现次数为奇数/偶数的权值数目…

M. Monster Hunter(树形dp)

M. Monster Hunter 才知道原来树形dp是三维的&#xff0c;一直没有学会过&#xff0c;感谢大佬的文章&#xff01;算法进阶—理解树形背包问题 状态表示&#xff1a;fi,k,j,{0/1}f_{i,k,j,\{0/1\}}fi,k,j,{0/1}​以iii为根的子树&#xff0c;考虑到第kkk个儿子时&#xff0c;…

Another Blog

说明&#xff1a; 此博客用于平时做题 但为了整理知识&#xff0c;用博客园来存知识 博客园网址&#xff1a; https://www.cnblogs.com/ssllyf

KubeCon+CloudNativeCon首秀中国!

2018年11月13-15日&#xff0c;全球顶级的Kubernetes官方技术论坛KubeConCloudNativeCon将首次登陆中国&#xff0c;此次活动由云原生计算基金会&#xff08;CNCF&#xff09;主办&#xff0c;在上海跨国采购会展中心隆重举行。KubeCon CloudNativeConKubeConCloudNativeCon 是…