工作原理

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}");})

仅仅与 WaitAndRetrySleepDurationProvider 的参数有点不同

小结

此篇大体概括了 Polly 重试的几种方式, 当然 Polly Retry 还有很多重载, 但作用都是围绕 程序异常时进行自我调整再重试 为中心。

转载于:https://www.cnblogs.com/rajesh/p/10773564.html

Polly 重试策略相关推荐

  1. 弹性和瞬态故障处理库Polly之重试策略

    弹性和瞬态故障处理库Polly 源码及参考见文章底部 Nuget中Polly库的引用: Install-Package Polly 以下策略调用的方法: 详细代码见 public static int ...

  2. .NET6之MiniAPI(二十四):用Polly重试

    为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断.重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止:熔断是为了防止太多的次数的无效访问,导致系统不可知异常. Poll ...

  3. .NET Core 微服务之Polly熔断策略

    紧接着上一篇说,咱们继续介绍Polly这个类库 熔断策略(Circuit-breaker) 如果调用某个目标服务出现过多超时.异常等情况,可以采取一定时间内熔断该服务的调用,熔断期间的请求将不再继续调 ...

  4. .NET Core Polly 重试 熔断 降级

    Polly是一个弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略,其主要功能如下: 重试(Retry) 断路器(Circuit-Breaker) 超时 ...

  5. [js] 异步请求重试策略有哪些呢?

    [js] 异步请求重试策略有哪些呢? 重试次数.重试时间间隔等 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

  6. 从gRPC的重试策略说起

    本文首发在 技术成长之道 博客,访问 hechen0.com 查看更多,或者微信搜索「技术成长之道」关注我的公众号,或者扫描下方二维码关注 公众号获得第一时间更新通知! 本文让你了解 重试解决什么问题 ...

  7. RocketMQ重试策略及与Springboot整合

    注:基础请参考上一篇文章RocketMQ简介与安装及入门 1. 重试策略 在消息的发送和消费过程中,都有可能出现错误,如网络异常等,出现了错误就需要进行错误重试,这种消息的重试需要分2种,分别是pro ...

  8. RabbitMQ消费失败重试策略、及重试策略应用场景详解

    前言: RabbitMQ消费者一般情况下,如果消费失败出现异常,那么消费端默认是无限重试消费,这样就会带来非常不好的一个情况,就是陷入死循环,一直报错一直重试.所以我们需要对消费异常重试次数.重试间隔 ...

  9. 以太坊怎么扫块,Magician-Web3 1.0.5 发布啦,加入了负载均衡 和 重试策略

    Magician-Web3 是一个区块链开发工具包.它由两个功能组成.一个是扫描区块链,根据开发者的需要监控交易.另一个是对 web3j 的一些二次打包,可以减少开发者在一些常见场景下的工作量.它计划 ...

最新文章

  1. (Hibernate进阶)Hibernate系列——总结篇(九)
  2. DCMTK:DSRDocument类的测试程序
  3. 无线网sdn服务器,什么是SDN,SDN网络与传统网络对比
  4. 使用JUnit对ADF应用程序进行单元测试
  5. Java开发需要达到什么样的水平才称得上架构师?
  6. 发布Drools Workbench到Tomcat on Linux
  7. Linux命令大全:grep命令
  8. 12.Vim 打造成 PHP 开发环境
  9. ISOIEC27000标准族-ISO27001关联体系
  10. 前端项目运行以后端口不是常见的8080等端口,端口数很大,不在配置的端口跑项目
  11. Apple PUSH Notication Service (APNS) 配置攻略
  12. 怀旧服ouf头像插件_魔兽世界7.0前夕ShadowedUF简洁头像插件
  13. 小型微利企业税收筹划策略探析
  14. 三星搁置OLED面板工厂计划可能投资microLED
  15. 电话,手机,微信账号,邮箱正则表达式校验
  16. MySQL - 设计游戏用户信息表
  17. 2021-10-16设备管理与维修
  18. radio选中触发事件以及获取选中的值
  19. C# 字符串比较优化(StringComparison)
  20. 对于《肖申克的救赎》的个人感悟

热门文章

  1. 创新将会出现在云端,边缘还是其他地方?
  2. ftp模式 503、227错误
  3. gradle 配置java 项目maven 依赖
  4. 巧用云计算 突围移动APP行业乱象
  5. Mac之当前目录打开终端
  6. 设计模式之【外观模式-Facade】
  7. JS function立即调用的几种写法
  8. 前序-中序-后序-非递归-实现
  9. Extjs 动态改变列名
  10. 基于matlab地球物理,基于MATLAB的《地球物理资料处理和解释》教学研究