原文:.NET的弹性及瞬间错误处理库Polly

本文基本是官方说明的翻译和总结(https://github.com/App-vNext/Polly)

什么是Polly?

Polly是一款基于.NET的弹性及瞬间错误处理库, 它允许开发人员以顺畅及线程安全的方式执行重试(Retry),断路器(Circuit),超时(Timeout),隔板隔离(Bulkhead Isolation)及后背策略(Fallback)。

Polly适用于.NET 4.0, .NET 4.5及.NET Standard 1.1(覆盖.NET Core, Mono, Xamarin.IOS, Xamarin.Android, UWP, WP 8.1+)。

安装Polly

.NET 4.0版本

Install-Package Polly.Net40Async

.NET 4.5及以上版本, .Net Standard 1.1

Install-Package Polly

弹性策略

Polly提供多种弹性策略。

重试策略

前提

程序会产生许多瞬时故障,但是在一定时间延迟之后,程序会自动纠正故障。

实现效果

允许配置自动重试。

断路器策略

前提

当系统发生严重故障时,快速响应请求失败比让用户等待要好。 避免故障系统过载有助于恢复系统。

实现效果

当系统错误超过预配置的数量,系统将断路一段时间。

超时策略

前提

超出一定时间的等待,想要得到正确的结果是不太可能的。

实现效果

保证调用者不需要等待超时。

隔板隔离

前提

当进程出现故障,多个失败的请求很容易占满服务器资源(线程/CPU)。 一个处于故障状态的下游系统,也会导致其上游系统故障。

实现效果

将严格管控故障进程,使其使用固定大小的资源池,隔离他们对其他进程的潜在影响

缓存策略

前提

一定比例的请求可能是相似的。

实现效果

从缓存中提供已知的响应。 当第一次读取的时候,将响应自动缓存起来。

后备策略

前提

当故障依然存在的时候,你打算做什么。

实现效果

当程序依然发生故障时,执行指定操作。

包装策略

前提

不同的故障需要不同的策略。包装策略即组合策略。

实现效果

允许灵活的将以上任意几种策略组合在一起。

如何使用Polly进行故障/异常处理?

Polly处理故障/异常有以下几个步骤。

  1. 指定处理的异常/故障类型
  2. [可选] 指定处理的异常返回值
  3. 指定处理策略
  4. 执行策略

指定处理异常/故障的类型

Polly使用Policy类的泛型方法Handle指定Polly需要处理异常/故障的类型。

指定单个异常类型

Policy.Handle<DivideByZeroException>()

指定带条件的异常类型

Policy.Handle<SqlException>(ex => ex.Number == 1205)

Polly也支持指定多种异常/故障类型, 这里需要使用Or方法

Policy.Handle<DivideByZeroException>().Or<ArgumentException>()

指定多个带条件的异常类型

Policy
.Handle<SqlException>(ex =ex.Number == 1205)
.Or<ArgumentException>(ex =ex.ParamName == "example")

Polly也支持指定内部异常

Policy
.HandleInner<HttpResponseException>()
.OrInner<OperationCanceledException>(ex => ex.CancellationToken == myToken)

指定处理的异常返回值

Polly除了支持处理异常/故障类型,还支持处理异常返回值。所谓的处理异常结果,就是当Polly监控的方法,返回某些特定结果时, Polly会触发异常/故障处理策略。

Polly使用Policy类的泛型方法HandleResult制定Polly需要处理的异常结果.

指定触发异常/故障处理策略的返回值

例如:当某个方法的返回值类型是HttpResposneMessage, 并且返回值的StatusCode是NotFound时,触发异常/故障处理策略。

Policy
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.NotFound)

指定多个返回值

Policy
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.InternalServerError)
.OrResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.BadGateway)

同时指定异常类型和返回值

HttpStatusCode[] httpStatusCodesWorthRetrying = {
HttpStatusCode.RequestTimeout, // 408
HttpStatusCode.InternalServerError, // 500
HttpStatusCode.BadGateway, // 502
HttpStatusCode.ServiceUnavailable, // 503
HttpStatusCode.GatewayTimeout // 504
};
HttpResponseMessage result = Policy
.Handle<HttpResponseException>()
.OrResult<HttpResponseMessage>(r => httpStatusCodesWorthRetrying.Contains(r.StatusCode))

指定异常处理策略

重试策略

重试一次

Policy
.Handle<DivideByZeroException>()
.Retry()

重试多次

Policy
.Handle<DivideByZeroException>()
.Retry(3)

重试多次,每次重试触发一个行为

Policy
.Handle<DivideByZeroException>()
.Retry(3, (exception, retryCount) =>
{
// do something
});

永久重试(直到成功)

永久重试

Policy
.Handle<DivideByZeroException>()
.RetryForever()

永久重试,每次重试触发一个行为

Policy
.Handle<DivideByZeroException>()
.RetryForever(exception =>
{
// do something
});

等待并重试

指定每个重试的间隔时间

Policy
.Handle<DivideByZeroException>()
.WaitAndRetry(new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(3)
});

在这个例子如果第一次出现异常,会在1秒后重试,如果依然出现异常,会在再次出现异常后2秒继续重试,以此类推,下次异常后3秒继续重试

每次重试,触发一个行为

Policy
.Handle<DivideByZeroException>()
.WaitAndRetry(new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(3)
}, (exception, timeSpan) => {
// do something
});

断路器策略

在发生指定次数的异常/故障之后,断开回路

Policy
.Handle<DivideByZeroException>()
.CircuitBreaker(2, TimeSpan.FromMinutes(1));

发生2次异常之后,断开回路1分钟

Action<Exception, TimeSpan> onBreak = (exception, timespan) => { ... };
Action onReset = () => { ... };
CircuitBreakerPolicy breaker = Policy
.Handle<DivideByZeroException>()
.CircuitBreaker(2, TimeSpan.FromMinutes(1), onBreak, onReset);

发生2次异常之后,断开回路1分钟, 在触发断路时触发onBreak方法,当重置断路器时,触发onReset方法

后备策略

Policy
.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank)

当程序触发异常/故障后,返回一个备用值

Policy
.Handle<Whatever>()
.Fallback<UserAvatar>(() => UserAvatar.GetRandomAvatar())

当程序触发异常/故障后,使用一个方法返回一个备用值

Policy
.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank, onFallback: (exception, context) =>
{
// do something
});

当程序触发异常/故障后,返回一个备用值,并触发一个方法

Policy
.Handle<Whatever>()
.Fallback<UserAvatar>(UserAvatar.Blank, onFallback: (exception, context) =>
{
// do something
});

执行策略

Polly将监控DoSomething方法,如果发生DivideByZeroException异常,就使用重试策略

var policy = Policy
.Handle<DivideByZeroException>()
.Retry(); policy.Execute(() => DoSomething());

向Polly上下文中传递任意值

var policy = Policy
.Handle<DivideByZeroException>()
.Retry(3, (exception, retryCount, context) =>
{
var methodThatRaisedException = context["methodName"];
Log(exception, methodThatRaisedException);
}); policy.Execute(
() => DoSomething(),
new Dictionary<string, object>() {{ "methodName", "some method" }}
);
 
 
 

.NET的弹性及瞬间错误处理库Polly的更多相关文章

  1. 基于.NET的弹性及瞬间错误处理库Polly

    本文基本是官方说明的翻译和总结(https://github.com/App-vNext/Polly) 什么是Polly? Polly是一款基于.NET的弹性及瞬间错误处理库, 它允许开发人员以顺畅及 ...

  2. NET Core微服务之路:弹性和瞬态故障处理库Polly的介绍

    前言 上一节中我们介绍了Ocelot的常见使用配置,通过json配置文件,实现API网关的请求处理.和一个使用DownStream扩展下游中间件,来实现Http转RPC的简单实现,功能不算强大,但可以 ...

  3. 弹性和瞬态故障处理库Polly

    介绍 本节我们来介绍一款强大的库Polly,Polly是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略. Polly针对对.NET 4. ...

  4. 已被.NET基金会认可的弹性和瞬态故障处理库Polly介绍

    前言 本节我们来介绍一款强大的库Polly,Polly是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略. Polly针对对.NET 4. ...

  5. 一点理解之 CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库

    @2019-02-14 [小记] CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪库,用来将单片机故障状态寄存器值翻译出来输出至终端上以便排错 CmBacktrace: AR ...

  6. 使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库

    使用 Canvas 实现一个类似 Google 的可视化的页面错误反馈库 iframe 嵌套 iframe iframe 包含 复制的 HTML 页面 和支持可以拖拽的工具栏 鼠标经过上面,智能识别 ...

  7. (数据科学学习手札135)tenacity:Python中最强大的错误重试库

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在编写程序尤其是与网络请求相关的程序, ...

  8. 服务容错处理库Polly使用

    服务容错处理库Polly使用 在进入SOA之后,我们的代码从本地方法调用变成了跨机器的通信.任何一个新技术的引入都会为我们解决特定的问题,都会带来一些新的问题.比如网络故障.依赖服务崩溃.超时.服务器 ...

  9. Hadoop 错误归档库

    在hive中操作任意mapreduce相关语句 The size of Container logs revealed the below error: 2015-04-24 11:41:41,858 ...

随机推荐

  1. loadrunner11迭代录制注册账号

    1.创建一个新的web脚本 2.我们就以loadrunner自带的WebTours为例子 3.点击确定后进入Web Tours主页,点击sign up now进行注册 4.输入用户名:test,密码: ...

  2. MySQL 复制夯住一例排查以及原理探讨

    目录 目录 一 引子 二 故障分析 三 故障解决 四 原理探讨 五 小结 文/温国兵 一 引子 研发反应,有台从库和主库不同步.由于业务读操作是针对从库的,数据不同步必定会带来数据的不一致,业务获取的 ...

  3. Solr全文检索

    1.Solr的安装 .环境要求 jdk1.+tomcat8+solr5.5.0 .将以上的软件包上传到服务器 . 安装tomcat8(解压文件) tar -zxvf apache-tomcat-.ta ...

  4. 对haproxy文件进行增删改查

    1.文件内容 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global ...

  5. Python-数学篇之计算方法的目录:

    目录: 1.出本专题的初衷: 2.参考计算方法的书籍: 3.具体算法的实现: (一)出本专题的初衷: 在我们机械专业的大二上学期课程中,能与计算机沾上边的科目就数<计算方法>了.简化为&q ...

  6. Linux 小知识翻译 - 「Linux」怎么读?

    主要讨论日语中的读法,所以没有完全按照原文来翻译. 「linux」的读法有很多(这里指在日语中),代表性的读法有以下几种: A). 李纳苦思 B). 李奴苦思 C). 纳依纳苦思 A和B相同的是将 l ...

  7. Team Dipper

    Team Dipper Dipper 来自追梦的7星,We Are From Now On! 说什么?图小了?没问题满足你! No.1 沉默深邃之境的术士,源自奥术之境的PHP探寻者 03150225 ...

  8. Python3编写网络爬虫05-基本解析库XPath的使用

    一.XPath 全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索 XPath 的选择功能十分强大,它提供了 ...

  9. Spring Cloud Eureka 属性作用

    配置参数 默认值 说明 服务注册中心配置 Bean类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean eu ...

  10. mvn 的 provided 以及 test等等 还有git团队开发技巧

    mvn 的 provided 以及 test等等 还有git团队开发技巧