工作原理

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. vue中用ajax上传文件

    直接上代码 <input class="file-btn" type="file" @change="uploadCompany($event) ...

  2. oracle解决导入高版本dmp报错问题:IMP-00058: ORACLE error 12547 encountered

    低版本oracle导入高版本的dmp时,导过的人都应该清楚,直接导入是会报错的,报错信息如下,其实解决这个问题很简单, 只要修改一下dmp内的版本号就可以了. 修改版本不能随便使用文本工具打开,否知会 ...

  3. 前端 CSS 目录

    前端 CSS 介绍 前端 CSS语法 前端 CSS 注释

  4. python基础-->流程控制-->分支结构-->单项分支-->双向分支

    # ###流程控制 ''' 流程:代码执行过程 流程控制:对代码执行过程的管控 顺序结构:代码默认从上到下依次执行 分支结构:对代码执行过程的管控 循环机构: while for ..in.... 分 ...

  5. Cocos Creator LabelAtlas(艺术数字的使用)

    # 艺术数字资源 (LabelAtlas) **艺术数字资源** 是一种用户自定义的资源,它可以用来配置艺术数字字体的属性. ## 创建艺术数字资源 在 **资源管理器** 中右键,可以在如下菜单中找 ...

  6. java中xxe漏洞修复方法

    java中禁止外部实体引用的设置方法不止一种,这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的!最早是有朋友在群里发了如下一个pdf, 而当时已经是2019年1月末了,应该不 ...

  7. vue组件弹窗

    定义弹窗组件 先写一个普通的vue组件,其显示的内容就是弹窗的内容. 文件的位置 /src/views/toast/toast.vue <template> <div class=& ...

  8. 深入理解javascript原型和闭包(转)

    深入理解javascript原型和闭包(完结)   说明: 该教程绕开了javascript的一些基本的语法知识,直接讲解javascript中最难理解的两个部分,也是和其他主流面向对象语言区别最大的 ...

  9. windows10的普通用户使用Task Scheduler的问题

    在Create Task 窗口的General选项卡中,在Security options 里有几个单选项,分别是 Run only when user is logged on ,Run wheth ...

  10. 从网卡发送数据再谈TCP/IP协议—网络传输速度计算-网卡构造

    在<在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP>里面提到 单个TCP包每次打包1448字节的数据进行发送(以太网Ethernet最大的数据帧是1518字节,以 ...