工作原理

Retry

基本重试:

public static void Retry()
{
var random = new Random(); // Policy<> 泛型定义返回值类型, 如若不需要返回值, 可直接使用 Policy
var 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<> 泛型定义返回值类型, 如若不需要返回值, 可直接使用 Policy
var 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 还有很多重载, 但作用都是围绕 程序异常时进行自我调整再重试 为中心。

Polly 重试策略的更多相关文章

  1. .NET Core 微服务之Polly重试策略

    接着上一篇说,正好也是最近项目里用到了,正好拿过来整理一下,园子里也有一些文章介绍比我详细. 简单介绍一下绍轻量的故障处理库 Polly  Polly是一个.NET弹性和瞬态故障处理库 允许我们以非常 ...

  2. Polly一种.NET弹性和瞬态故障处理库(重试策略、断路器、超时、隔板隔离、缓存、回退、策略包装)

    下载地址:https://github.com/App-vNext/Polly 该库实现了七种恢复策略. 重试策略(Retry) 重试策略针对的前置条件是短暂的故障延迟且在短暂的延迟之后能够自我纠正. ...

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

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

  4. 微服务之Polly熔断策略

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

  5. Azure Storage Client Library 重试策略建议

    有关如何配置 Azure Storage Library 重试策略的信息,可参阅 Gaurav Mantri 撰写的一篇不错的文章<SCL 2.0 – 实施重试策略>.但很难找到关于使用何 ...

  6. 关于HttpClient重试策略的研究

    一.背景 由于工作上的业务本人经常与第三方系统交互,所以经常会使用HttpClient与第三方进行通信.对于交易类的接口,订单状态是至关重要的. 这就牵扯到一系列问题: HttpClient是否有默认 ...

  7. Polly 熔断策略

    熔断策略主要以 CircuitBreaker 来完成. 工作原理 熔断器可以被看作为一个主要含有三个状态的状态机 如果以电路开关来看: 开关闭合对应 CLOSED 状态, 开关打开对应 OPEN 状态 ...

  8. nodejs异步请求重试策略总结

    对于node开发同学经常要处理异步请求,然后根据请求的结果或请求成功后的状态码做不同的策略处理,众多策略中最常用的一种就是重试策略.针对重试策略我们往往还需要设定一定的规则,如重试次数.重试时间间隔. ...

  9. feginclient和ribbon的重试策略

    //自定义重试次数// @Bean// public Retryer feignRetryer(){// Retryer retryer = new Retryer.Default(100, 1000 ...

随机推荐

  1. delphi 中实现当期日期 减去 若干小时的方法

    假定当期日期为:2011-08-01 15:00:00 now - 1      :代表前一天的日期 返回值:2011-07-31 15:00:00 now - 1/3   :代表8小时前       ...

  2. [vue开发记录]float label输入框

    上图: 组件代码: <!-- Created by Locke Ou on 2018/6/20. --> <template> <div> <div clas ...

  3. PL_SQL学习

    打印输出: dbms_output.put_line('AA'); 显示服务器输出信息  set serveroutput on; 打印出eid=1的员工姓名: declare v_name varc ...

  4. @RequestParam @PathVariable

    1.Request参数 在访问各种各样网站时,经常会发现网站的URL的最后一部分形如:?xxxx=yyyy&zzzz=wwww.这就是HTTP协议中的Request参数,它有什么用呢?先来看一 ...

  5. 下载安装Git

    1.下载地址:https://git-scm.com/download/win  这里是下载64位的 2.安装步骤 (1)下载完成得到一个exe文件,双击傻瓜式安装 (2)开始安装 (3)选择安装的工 ...

  6. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  7. git merge后如何撤销

    merge后发现冲突太多,或者合并的分支代码并不是最新,那就直接撤销再合并好了. git reset --hard HEAD 用来撤销还没commit 的merge,其实原理就是放弃index和工作区 ...

  8. chrome浏览器多开的方法

    Chrome浏览器在上网的过程中,会保存一些用户数据,如缓存.cookie.收藏的网页等信息. 这些信息的保存位置是可以设置的.方法也很简单: 桌面上复制一个Chrome的快捷方式,编辑属性,添加-- ...

  9. 灵雀云获邀加入CDF(持续交付基金会),成为中国区三大创始成员之一

    3月12日,在加州Half Moon Bay举行的开源领导者峰会(Open Leadership Summit 2019 )上,CDF(Continuous Delivery Foundation ) ...

  10. program与module

    program,各方面与module都类似,其中声明的变量在program中都可见, 生命周期也是static类型的, program的结束,也是需要等待其中的所有initial块都执行结束. 与mo ...