当前位置: 首页 > news >正文

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.lryc.cn/news/222453.html

相关文章:

  • 20231107-前端学习炫酷菜单效果和折叠侧边栏
  • 基于CLIP的图像分类、语义分割和目标检测
  • python爬虫(数据获取——selenium)
  • [wp]NewStarCTF 2023 WEEK5|WEB
  • 未将对象引用设置到对象实例
  • 网络的地址簿:Linux DNS服务的全面指南
  • 输电线路AR可视化巡检降低作业风险
  • 18. 四数之和
  • 排序:堆排序(未完待续)
  • 小米智能电视投屏方法
  • 保外就医罪犯收到指定医院《罪犯病情诊断书》及检测、检查报告等其他医疗文书后,应当在规定时限内提交( ),或者受委托司法所审查。
  • pytorh模型训练、测试
  • MySQL 8.0 Clone Plugin 详解
  • 掌握未来技术趋势:深度学习与量子计算的融合
  • 京东数据分析:2023年9月京东笔记本电脑行业品牌销售排行榜
  • 3 任务3 使用趋动云部署自己的stable-diffusion
  • C语言 memset
  • Windows安装svn命令
  • vr航天探索科普展vr航天科普亲子嘉年华
  • 双11“万亿交易额”背后,浪潮信息助力银行扛住交易洪流
  • geoserver发布同一字段的多值渲染
  • 软考 系统架构设计师之考试感悟
  • 深入Spring Cloud LoadBalancer:策略全解析与缓存机制
  • MySQL的高阶语句
  • 适合汽车音频系统的ADAU1977WBCPZ、ADAU1978WBCPZ、ADAU1979WBCPZ四通道 ADC,24-bit,音频
  • 设计模式-状态模式 golang实现
  • 通过docker快速部署RabbitMq
  • Spring Boot 配置文件中的中文读取出来是乱码,或者是问号
  • 【系统架构设计】架构核心知识: 3.8 ADL和产品线
  • imagettftext(): Could not find/open font 解决办法