工作原理

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. 微信小程序登录流程及解析用户openid session_key,获取用户信息

    为优化用户体验,使用 wx.getUserInfo 接口直接弹出授权框的开发方式将逐步不再支持.从2018年4月30日开始,小程序与小游戏的体验版.开发版调用 wx.getUserInfo 接口,将无 ...

  2. 《图解HTTP》读书笔记(七:通信数据转发程序-代理/网关/隧道)

    HTTP通信时,除客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理.网关和隧道,它们可以配合服务器工作.这些服务器和应用程序可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服 ...

  3. php json 中文不转义 & 转义为中文

    JSON_UNESCAPED_UNICODE private function decodeUnicode($str){ return preg_replace_callback('/\\\\u([0 ...

  4. element-ui+vue-treeselect校验

    element-ui+vue-treeselect下拉框的校验 问题陈述: 在element-ui中有自带的表单验证,但是使用的vue-treeselect无法验证 vue-treeselect DE ...

  5. Visual Studio 的插件及常用快捷键_ 系统Ubuntu16.04

    安装在 Ubuntu 的系统上 1, 常用的快捷键 [1] 调出终端: Ctrl + `(反引号); [2] 调出插件安装界面: Ctrl + P (打开插件面板) ---> 输入  ext i ...

  6. 虚拟机——虚拟机VMware Workstation 的.vmdk格式与VirtualBox 的.vdi格式相互转换

    啦啦啦~~~ 由于现在Vmware Workstation的越来越普及,让很多小伙伴不知道怎么把以前用的VirtualBox虚拟机vdi格式转换成vmdk格式,下面我们就来转换一下吧... 第一步:找 ...

  7. 再谈HTTP2性能提升之背后原理—HTTP2历史解剖

    即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...

  8. CentOS 7 本地安装kubernetes

    环境 : CentOS7 master    192.168.94.11 node1 192.168.94.22 node2 192.168.94.33 关闭防火墙.SElinux 安装包地址 : 链 ...

  9. SSH的软链接后门

    之前说过为了防止SSH的后面漏洞 , 升级到高版本的OpenSSH , 那也不能保证万无一失 经典后门  直接对sshd建立软连接 , 之后用任意密码登录即可 看下面操作 创建完软连接后  创建新的会 ...

  10. 极致21点开发DAY4

    完成的内容:1.修改上一篇博文中的Bug  2.完成任务窗口逻辑 using System; using System.Collections.Generic; using UnityEngine; ...