Polly 重试策略
工作原理
Retry
基本重试:
public static void Retry()
{var random = new Random();// Policy<> 泛型定义返回值类型, 如若不需要返回值, 可直接使用 Policyvar obj = Policy<object>// Handle<> 可指定需要处理的异常类型.Handle<Exception>()//也可以使用重载对Exception 进行再次过滤//.Handle<Exception>(e => e is NotSupportedException) .Retry(3, (res, i, c) =>{//当委托的代码块执行失败时会进入此 Action, //这里可以对抛出的异常进行日志或其他处理Console.WriteLine($"retry {i}th times, ex: {res.Exception?.Message}");}).Execute(() =>{var val = random.Next(0, 100);switch (val % 3){case 0:return "Success";default:throw new Exception($"random val: {val}");}});Console.WriteLine(obj);
}
输出:
重试一次成功:
重试两次成功:
重试三次均失败:
可以看到,再超过重试次数的时候, 若程序还是异常,则抛出异常。
RetryForever
成功前一直重试:
public static void RetryForever()
{var random = new Random();// Policy<> 泛型定义返回值类型, 如若不需要返回值, 可直接使用 Policyvar obj = Policy<object>// Handle<> 可指定需要处理的异常类型.Handle<Exception>()//也可以使用重载对Exception 进行再次过滤//.Handle<Exception>(e => e is NotSupportedException) .RetryForever((res, i, c) =>{//当委托的代码块执行失败时会进入此 Action, //这里可以对抛出的异常进行日志或其他处理Console.WriteLine($"retry {i}th times, ex: {res.Exception?.Message}");}).Execute(() =>{var val = random.Next(0, 100);switch (val % 999){case 0:return $"Success, val: {val}";default:throw new Exception($"random val: {val}");}});Console.WriteLine(obj);
}
输出:
将 case 0:
这个分支去掉, 任务将变为不可能成功,会发现一直输出重试。
WaitAndRetry
程序异常后做短暂延迟再次重试:
.WaitAndRetry(5, // 设置 Sleep Duration Provider 来提供延迟时间retryTimes => TimeSpan.FromSeconds(Math.Pow(2, retryTimes)),(res, delay, times, context) =>{//当委托的代码块执行失败时会进入此 Action, //这里可以对抛出的异常进行日志或其他处理Console.WriteLine($"retry {times}th times, sleep: {delay.TotalSeconds}s, ex: {res.Exception?.Message}");})
可以看到我们在 WaitAndRetry
方法中提供了延迟方式: retryTimes => TimeSpan.FromSeconds(Math.Pow(2, retryTimes)),
, 这是一种比较典型的延迟方式,叫做 指数退避。
输出:
WaitAndRetryForever
.WaitAndRetryForever(// 设置 Sleep Duration Provider 来提供延迟时间(retryTimes, res, context) => TimeSpan.FromSeconds(Math.Pow(2, retryTimes)),(res, times, delay, context) =>{//当委托的代码块执行失败时会进入此 Action, //这里可以对抛出的异常进行日志或其他处理Console.WriteLine($"retry {times}th times, sleep: {delay.TotalSeconds}s, ex: {res.Exception?.Message}");})
仅仅与 WaitAndRetry
的 SleepDurationProvider
的参数有点不同
小结
此篇大体概括了 Polly 重试的几种方式, 当然 Polly Retry 还有很多重载, 但作用都是围绕 程序异常时进行自我调整再重试 为中心。
转载于:https://www.cnblogs.com/rajesh/p/10773564.html
Polly 重试策略相关推荐
- 弹性和瞬态故障处理库Polly之重试策略
弹性和瞬态故障处理库Polly 源码及参考见文章底部 Nuget中Polly库的引用: Install-Package Polly 以下策略调用的方法: 详细代码见 public static int ...
- .NET6之MiniAPI(二十四):用Polly重试
为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断.重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止:熔断是为了防止太多的次数的无效访问,导致系统不可知异常. Poll ...
- .NET Core 微服务之Polly熔断策略
紧接着上一篇说,咱们继续介绍Polly这个类库 熔断策略(Circuit-breaker) 如果调用某个目标服务出现过多超时.异常等情况,可以采取一定时间内熔断该服务的调用,熔断期间的请求将不再继续调 ...
- .NET Core Polly 重试 熔断 降级
Polly是一个弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略,其主要功能如下: 重试(Retry) 断路器(Circuit-Breaker) 超时 ...
- [js] 异步请求重试策略有哪些呢?
[js] 异步请求重试策略有哪些呢? 重试次数.重试时间间隔等 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题
- 从gRPC的重试策略说起
本文首发在 技术成长之道 博客,访问 hechen0.com 查看更多,或者微信搜索「技术成长之道」关注我的公众号,或者扫描下方二维码关注 公众号获得第一时间更新通知! 本文让你了解 重试解决什么问题 ...
- RocketMQ重试策略及与Springboot整合
注:基础请参考上一篇文章RocketMQ简介与安装及入门 1. 重试策略 在消息的发送和消费过程中,都有可能出现错误,如网络异常等,出现了错误就需要进行错误重试,这种消息的重试需要分2种,分别是pro ...
- RabbitMQ消费失败重试策略、及重试策略应用场景详解
前言: RabbitMQ消费者一般情况下,如果消费失败出现异常,那么消费端默认是无限重试消费,这样就会带来非常不好的一个情况,就是陷入死循环,一直报错一直重试.所以我们需要对消费异常重试次数.重试间隔 ...
- 以太坊怎么扫块,Magician-Web3 1.0.5 发布啦,加入了负载均衡 和 重试策略
Magician-Web3 是一个区块链开发工具包.它由两个功能组成.一个是扫描区块链,根据开发者的需要监控交易.另一个是对 web3j 的一些二次打包,可以减少开发者在一些常见场景下的工作量.它计划 ...
最新文章
- (Hibernate进阶)Hibernate系列——总结篇(九)
- DCMTK:DSRDocument类的测试程序
- 无线网sdn服务器,什么是SDN,SDN网络与传统网络对比
- 使用JUnit对ADF应用程序进行单元测试
- Java开发需要达到什么样的水平才称得上架构师?
- 发布Drools Workbench到Tomcat on Linux
- Linux命令大全:grep命令
- 12.Vim 打造成 PHP 开发环境
- ISOIEC27000标准族-ISO27001关联体系
- 前端项目运行以后端口不是常见的8080等端口,端口数很大,不在配置的端口跑项目
- Apple PUSH Notication Service (APNS) 配置攻略
- 怀旧服ouf头像插件_魔兽世界7.0前夕ShadowedUF简洁头像插件
- 小型微利企业税收筹划策略探析
- 三星搁置OLED面板工厂计划可能投资microLED
- 电话,手机,微信账号,邮箱正则表达式校验
- MySQL - 设计游戏用户信息表
- 2021-10-16设备管理与维修
- radio选中触发事件以及获取选中的值
- C# 字符串比较优化(StringComparison)
- 对于《肖申克的救赎》的个人感悟