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

1. 重试(Retry)

Policy
.Handle<Exception>()    //指定需要重试的异常类型
.Retry(2,(ex,count,context)=> {      //指定发生异常重试的次数Console.WriteLine($ "重试次数{count},异常{ex.Message}" );
})                                         
.Execute(() => Console.Write( "execute method!" )); //指定执行的方法
const int retryTimes = 2;//重连次数
static RetryPolicy policy = Policy.Handle<Exception>().WaitAndRetry(retryTimes, retryAttempt => TimeSpan.FromSeconds(Math.Pow(0, retryAttempt)));

重试策略的使用步骤:

  • 指定需要处理的异常
  • 指定重试次数和监控重试
  • 指定执行的任务

2. 超时(Timeout)

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

3. 熔断(Circuit-breaker)

在执行某个任务时,多次重试依然出现超时或则异常,且重试的次数已经超过了系统设定上限。此时中断当前的执行,快速响应失败信息给用户,等待一段时间再进行恢复,继续执行。

var  breakerPlocy = Policy.Handle<Exception>()      //指定异常类型
.CircuitBreaker(5, TimeSpan.FromSeconds(30),                //设置5次阀值,中断30秒
onBreak: (ex, timeSpan) => { Console.WriteLine( "onBreak" ); },  //中断回调
onReset: () => { Console.WriteLine( "onReset" ); });             //重置回调
Policy.Handle<SomeException>().CircuitBreaker(2, TimeSpan.FromMinutes(1));//当系统出现2次某个异常后,停止重试,等待1min后重试

 

4. 回退(Fallback)

当我们的操作注定会失败时,我们就需要有一个合理的返回信息来替代失败信息,即备用方案。

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

 

5. 隔板隔离策略

当进程出现故障,多次失败,并一直占用主机的资源, 此时用隔离板隔离有互相影响的操作,将受管制的资源 限制在一个固定的资源池中。

Policy.Bulkhead(10, (context) => { });
//指定最大的线程数,,若执行被拒绝,则执行回调

6.缓存策略

当 数据更新周期较长且使用频繁,我们可以首次加载这些数据时将这些数据缓存起来。

ISyncCacheProvider cacheProvider =  new  StubCacheProvider();
Func<Context,  string > cacheKeyStrategy =  null ;
Action action = () => Policy.Cache(cacheProvider, TimeSpan.MaxValue, cacheKeyStrategy);
var memoryCacheProvider = new MemoryCacheProvider(myMemoryCache);
var cachePolicy = Policy.Cache(memoryCacheProvider, TimeSpan.FromMinutes(5));
TResult result = cachePolicy.Execute(context => getFoo(), new Context("FooKey"));

 

7. 策略包装策略

不同的异常需要不同的策略,弹性的使用策略来应对不同的异常信息。

NoOpPolicy policy0 = Policy.NoOp();
NoOpPolicy policy1 = Policy.NoOp();
NoOpPolicy policy2 = Policy.NoOp();
PolicyWrap policyWrap = Policy.Wrap(policy0, policy1, policy2);
var policyWrap = Policy.Wrap(fallback, cache, retry, breaker, timeout, bulkhead);
policyWrap.Execute(...);

 

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

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

相关文章

京东按关键词搜索商品列表接口:竞品分析,商品管理,营销策略制定

京东搜索商品列表接口是京东开放平台提供的一种API接口&#xff0c;通过调用该接口&#xff0c;开发者可以获取京东平台上商品的列表数据&#xff0c;包括商品的标题、价格、库存、月销量、总销量、详情描述、图片等信息。 接口的主要作用包括&#xff1a; 市场调研&#xff…

OSPF下的MGRE实验

一、实验要求 1、R1-R3-R4构建全连的MGRE环境 2、R1-R5-R6建立hub-spoke的MGRE环境&#xff0c;其中R1为中心 3、R1-R3...R6均存在环回网段模拟用户私网&#xff0c;使用OSPF使全网可达 4、其中R2为ISP路由器&#xff0c;仅配置IP地址 二、实验拓扑图 三、实验配置 1、给各路…

iPortal如何灵活设置用户名及密码的安全规则

作者&#xff1a;yx 目录 前言 一、配置文件介绍 1、<passwordRules>节点 注意事项&#xff1a; 2、<usernameRules>节点 二、应用实例 1、配置文件设置 2、验证扩展结果 三、结果展示 前言 SuperMap iPortal提供了扩展账户信息合规度校验规则的能力&#…

下面是一个使用线程池执行多线程请求的示例代码,该示例使用PoolingHttpClientConnectionManager来管理连接池:

下面是一个使用线程池执行多线程请求的示例代码&#xff0c;该示例使用PoolingHttpClientConnectionManager来管理连接池&#xff1a; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.meth…

一名优秀的C++人员是怎么炼成的?

一名优秀的C人员是怎么炼成的? 优秀的程序员都是解决各种bug锻炼出来的&#xff0c;程序员每天的工作大部分时间都是在解决各种bug, 所以说多做项目才是提升能力的唯一途径&#xff0c;要不然就是花架子&#xff0c;各种技术名词、源码整的很溜&#xff0c;一如果不是喜欢 C …

WPF中依赖属性及附加属性的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 依赖属性 由依赖属性提供的属性功能 与字段支持的属性不同&#xff0c;依赖属性扩展了属性的功能。 通常&#xff0c;添加的功能表示或支持以下功能之一&#xff1a; 资源数据绑定样式动画元数据重写属性值继承WPF 设计器集成 …

阴虱是怎么长出来的?皮肤性病科主任谭巍讲述五大因素

阴虱&#xff0c;是一种皮肤接触性传染性寄生虫病&#xff0c;在卫生情况不好的前提下有感染阴虱的可能性。人在感染阴虱后会对身心健康带来负面影响&#xff0c;所产生的临床症状会直接影响感染者的工作生活&#xff0c;所以日常应注意预防阴虱病。 然而&#xff0c;到现在还…

AI时代项目经理与架构师的成长之道:ChatGPT让你插上翅膀

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 在AI时代&#xff0c;项…

Vue3.0 声明式导航,编程式导航,路由,路由拦截案例

项目结构 App.vue&#xff1a;根组件 <template><div><router-view></router-view><Tabbar></Tabbar></div> </template> <script setup> import Tabbar from ../src/views/Tabbar.vue; //底部选项卡 import Home from…

Android T窗口动画添加移除流程(更新中)

APP侧窗口动画demo 如何创建一个窗口动画&#xff1f;我们通过先从APP创建一个窗口&#xff0c;以这个窗口的创建过程的窗口动画为例 这个demo就是点击BUTTON显示窗口&#xff0c;点击CLOSE WINDOW关闭窗口&#xff0c;下面简述关键代码 //定义WindowManager和LayoutParams…

Go:如何在GoLand中引用github.com中的第三方包

本篇博客主要介绍如何在GoLand中引入github.com中的第三方包。具体步骤如下&#xff1a; 正文 (1) 先在GoLand中打开go的工作区目录(即环境变量$GOPATH设置的变量)。如图&#xff1a; 关于工作区目录中的三个子目录: bin: 保存已编译的二进制可执行程序&#xff1b;pkg: 保…

AUGMENTING LOGICAL REASONING CAPABILITIES WITH LARGE LANGUAGE MODELS

本文是LLM系列文章&#xff0c;针对《FROM INDETERMINACY TO DETERMINACY: AUGMENTING LOGICAL REASONING CAPABILITIES WITH LARGE LANGUAGE MODELS》的翻译。 从不确定性到确定性&#xff1a;用大型语言模型增强逻辑推理能力 摘要1 引言2 相关工作3 DETERMLR4 实验5 结论 摘…

Selenium增加Chrome稳定性的参数

增加Chrome进程的稳定性的确切参数可能因Chrome版本和操作系统而异。然而&#xff0c;以下是一些常见的命令行参数&#xff0c;可以在启动Chrome时尝试以提高稳定性&#xff1a; --disable-extensions: 这将禁用所有插件和扩展&#xff0c;有时插件可能会引起稳定性问题。--dis…

深度学习之基于Tensorflow卷积神经网络花卉识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习是一种机器学习方法&#xff0c;它通过模拟人脑神经网络的结构和功能来实现对数据的自动分析和学习。卷积神…

SpringCloud——服务网关——GateWay

1.GateWay是什么&#xff1f; gateway也叫服务网关&#xff0c;SpringCloud GateWay使用的是Webflux中的reactor-netty响应式编程组件&#xff0c;底层使用了Netty通讯框架。 gateway的功能有反向代理、鉴权、流量控制、熔断、日志监控...... 2.为什么不使用Zuul&#xff1f…

EasyExcel 导出冻结指定行

导出的实体类 package org.jeecg.modules.eis.test;import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.*; import lombok.Getter; import lombok.Setter; import org.apache.poi.ss.usermodel.HorizontalAlignment;import…

Android Studio代码无法自动补全

Android Studio代码自动无法补全问题解决 在写layout布局文件时&#xff0c;代码不提示&#xff0c;不自动补全&#xff0c;可以采用如下方法&#xff1a; 点击File—>Project Structure&#xff0c;之后如图所示&#xff0c;找到左侧Modules&#xff0c;修改SDK版本号&…

R语言中的函数26:polyroot多项式求根函数

目录 介绍函数介绍参数含义 示例 介绍 R语言中的base::polyroot()可以用于对多项式求根&#xff0c;求根的多项式可以是复数域上的。 函数介绍 polyroot(z)该函数利用Jenkins-Traub算法对多项式 p ( x ) p(x) p(x)进行求根&#xff0c;其中 p ( x ) z 1 z 2 x ⋯ z n x…

Android笔记:(最全)判断网线是否插入方法

1.通过调用命令: cat /sys/class/net/eth0/carrier1.1在java代码中执行adb命令: private fun execCommand(command: String?): String {val runtime

【算法秘籍】藏在0和1之间的秘密,助你码出优秀人生

《算法秘籍》双十一 5折购书&#xff0c;就在京东商城 数据结构和算法是计算机科学的基石&#xff0c;是计算机的灵魂&#xff0c;要想成为计算机专业人员&#xff0c;学习和掌握算法是十分必要的。不懂数据结构和算法的人不可能写出效率更高的代码。计算机科学的很多新行业都离…