弹性和瞬态故障处理库Polly
介绍
本节我们来介绍一款强大的库Polly,Polly是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略。 Polly针对对.NET 4.0,.NET 4.5和.NET Standard 1.1以及.NET Core实现,该项目作者现已成为.NET基金会一员,项目一直在不停迭代和更新,项目地址【https://github.com/App-vNext/Polly】,你值得拥有。接下来我们以.NET Framework 4.5来演示它的强大功能。

简单的例子
using System; namespace Polly
{
class Program
{
static void Main(string[] args)
{
// 这个例子展示了当执行的时候如果遇到RedisLockException的异常则会进行重试调用。
var policy = Policy
.Handle<RedisLockException>() // 定义条件
.Retry(); // 定义处理方式 // 执行
policy.Execute(() =>
{
Console.WriteLine("异常之前");
throw new RedisLockException("create lock failed");
Console.WriteLine("异常之后");
}
);
}
} public class RedisLockException : Exception
{
public RedisLockException(string message) : base(message)
{
Console.WriteLine(message);
}
}
}

定义条件
// 单个异常类型
var policy1 = Policy
.Handle<RedisLockException>() // 定义条件
.Retry(); // 定义处理方式 // 限定条件的单个异常 异常和表达式都要符合
var policy2 = Policy
.Handle<RedisLockException>(ex => ex.Message == "wolf")
.Retry(); // 定义处理方式 // 执行
policy2.Execute(() =>
{
Console.WriteLine("异常之前");
throw new RedisLockException("wolf");
Console.WriteLine("异常之后");
}
); // 多个异常类型
Policy
.Handle<HttpRequestException>()
.Or<OperationCanceledException>()
.Retry(); // 定义处理方式 // 限定条件的多个异常
Policy
.Handle<SqlException>(ex => ex.Number == )
.Or<ArgumentException>(ex => ex.ParamName == "example")
.Retry(); // 定义处理方式 // Inner Exception 异常里面的异常类型
Policy
.HandleInner<HttpRequestException>()
.OrInner<OperationCanceledException>(ex => ex.CancellationToken != new System.Threading.CancellationToken())
.Retry(); // 定义处理方式
以及用返回结果来限定
// 返回结果加限定条件
Policy
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.NotFound) // 处理多个返回结果
Policy
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.InternalServerError)
.OrResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.BadGateway) // 处理元类型结果 (用.Equals)
Policy
.HandleResult<HttpStatusCode>(HttpStatusCode.InternalServerError)
.OrResult<HttpStatusCode>(HttpStatusCode.BadGateway) // 在一个policy里面同时处理异常和返回结果。
HttpStatusCode[] httpStatusCodesWorthRetrying = {
HttpStatusCode.RequestTimeout, //
HttpStatusCode.InternalServerError, //
HttpStatusCode.BadGateway, //
HttpStatusCode.ServiceUnavailable, //
HttpStatusCode.GatewayTimeout //
};
HttpResponseMessage result = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(r => httpStatusCodesWorthRetrying.Contains(r.StatusCode))
.RetryAsync(...)
.ExecuteAsync( /* some Func<Task<HttpResponseMessage>> */ )
重试策略(Retry)
重试策略针对的前置条件是短暂的故障延迟且在短暂的延迟之后能够自我纠正。允许我们做的是能够自动配置重试机制。
按次数重试
using System; namespace Polly
{
class Program
{
static void Main(string[] args)
{
// 重试1次
Policy
.Handle<RedisLockException>()
.Retry().Execute(() => { throw new RedisLockException(""); }); //// 重试3(N)次
Policy
.Handle<RedisLockException>()
.Retry().Execute(() => { throw new RedisLockException(""); }); ; //// 重试多次,加上重试时的action参数
Policy
.Handle<RedisLockException>()
.Retry(, (exception, retryCount) =>
{
Console.WriteLine(exception.Message);
Console.WriteLine(retryCount);
}).Execute(() => { throw new RedisLockException(""); });
}
} public class RedisLockException : Exception
{
public RedisLockException(string message) : base(message)
{
Console.WriteLine(message);
}
}
}
不断重试
using System; namespace Polly
{
class Program
{
static void Main(string[] args)
{
// 不断重试,直到成功
Policy
.Handle<RedisLockException>()
.RetryForever().Execute(() => { }); // 不断重试,带action参数在每次重试的时候执行
Policy
.Handle<RedisLockException>()
.RetryForever(exception =>
{
// do something
}).Execute(() => { });
}
} public class RedisLockException : Exception
{
public RedisLockException(string message) : base(message)
{
Console.WriteLine(message);
}
}
}
等待之后重试
using System; namespace Polly
{
class Program
{
static void Main(string[] args)
{
// 重试3次,分别等待10、20、30秒。
Policy
.Handle<RedisLockException>()
.WaitAndRetry(new[]
{
TimeSpan.FromSeconds(),
TimeSpan.FromSeconds(),
TimeSpan.FromSeconds()
}).Execute(() => { throw new RedisLockException(""); });
}
} public class RedisLockException : Exception
{
public RedisLockException(string message) : base(message)
{
Console.WriteLine(message);
}
}
}
熔断
熔断也可以被作为当遇到某种错误场景下的一个操作。以下代码展示了当发生2次RedisLockException的异常的时候则会熔断1分钟,该操作后续如果继续尝试执行则会直接返回错误 。
Policy
.Handle<SomeExceptionType>()
.CircuitBreaker(, TimeSpan.FromMinutes());
回退(Fallback)
操作仍然会失败,也就是说当发生这样的事情时我们打算做什么。也就是说定义失败返回操作。
class Program
{
static void Main(string[] args)
{
try
{
var fallBackPolicy =
Policy<string>
.Handle<DivideByZeroException>()
.Fallback("执行失败,返回Fallback");
//运行异常时,设置默认值
var fallBack = fallBackPolicy.Execute(Compute);
Console.WriteLine(fallBack);
}
catch (DivideByZeroException e)
{
Console.WriteLine($"Excuted Failed,Message: ({e.Message})");
}
Console.Read();
} static string Compute()
{
var a = ;
a = / a;
return "无异常时函数";
}
}
弹性和瞬态故障处理库Polly的更多相关文章
- 已被.NET基金会认可的弹性和瞬态故障处理库Polly介绍
前言 本节我们来介绍一款强大的库Polly,Polly是一种.NET弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略. Polly针对对.NET 4. ...
- NET Core微服务之路:弹性和瞬态故障处理库Polly的介绍
前言 上一节中我们介绍了Ocelot的常见使用配置,通过json配置文件,实现API网关的请求处理.和一个使用DownStream扩展下游中间件,来实现Http转RPC的简单实现,功能不算强大,但可以 ...
- Polly一种.NET弹性和瞬态故障处理库(重试策略、断路器、超时、隔板隔离、缓存、回退、策略包装)
下载地址:https://github.com/App-vNext/Polly 该库实现了七种恢复策略. 重试策略(Retry) 重试策略针对的前置条件是短暂的故障延迟且在短暂的延迟之后能够自我纠正. ...
- 【微服务No.2】polly微服务故障处理库
熔断.降级: 熔断:熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地常识执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也 ...
- .NET的弹性及瞬间错误处理库Polly
原文:.NET的弹性及瞬间错误处理库Polly 本文基本是官方说明的翻译和总结(https://github.com/App-vNext/Polly) 什么是Polly? Polly是一款基于.NET ...
- 服务容错处理库Polly使用
服务容错处理库Polly使用 在进入SOA之后,我们的代码从本地方法调用变成了跨机器的通信.任何一个新技术的引入都会为我们解决特定的问题,都会带来一些新的问题.比如网络故障.依赖服务崩溃.超时.服务器 ...
- 基于.NET的弹性及瞬间错误处理库Polly
本文基本是官方说明的翻译和总结(https://github.com/App-vNext/Polly) 什么是Polly? Polly是一款基于.NET的弹性及瞬间错误处理库, 它允许开发人员以顺畅及 ...
- ASP VNext 开源服务容错处理库Polly使用文档
在进入SOA之后,我们的代码从本地方法调用变成了跨机器的通信.任何一个新技术的引入都会为我们解决特定的问题,都会带来一些新的问题.比如网络故障.依赖服务崩溃.超时.服务器内存与CPU等其它问题.正是因 ...
- 容错处理库Polly使用文档
Design For Failure1. 一个依赖服务的故障不会严重破坏用户的体验.2. 系统能自动或半自动处理故障,具备自我恢复能力. 以下是一些经验的服务容错模式 超时与重试(Timeout an ...
随机推荐
- 用户态驱动--UIO机制的实现【转】
转自:https://blog.csdn.net/u013982161/article/details/51584900 1 uio理论部分 1.1为什么出现了UIO? 硬件设备可以根据功能分为网 ...
- 负载均衡集群中的session解决方案【转】
通常面临的问题 从用户端来解释,就是当一个用户第一次访问被负载均衡代理到后端服务器A并登录后,服务器A上保留了用户的登录信息:当用户再次发送请求时, 根据负载均衡策略可能被代理到后端不同的服务器,例如 ...
- hibernate框架学习之数据抓取(加载)策略helloworld
package cn.itcast.h3.query.hql; import java.util.List; import org.hibernate.Query; import org.hibern ...
- 竞赛常用STL备忘录
__builtin: __builtin_popcount:二进制中 1 的个数__builtin_ctz:末尾的 0,即对 lowbit 取log__builtin_clz:开头的 0,用 31 减 ...
- 【翻译】Chemkin - Chapter 1
[这段文字是2013年3月翻译的,整理老文档时发现就拿出来,提醒我们:任何试图翻译英文手册的尝试都是徒劳的] 第一章 介绍 Chemkin理论手册提供了一个对关系和公式的宽泛的概览,这些关系和公式 ...
- openvpn 给客户端固定隧道IP地址
openvpn 客户端拿到的ip地址是服务器端随机分配的,因此需要远程ssh到一个终端时,它的ip地址有时会变,如何给他固定IP地址呢. 方法如下: 1) 在服务器端使用的配置文件 server.co ...
- hadoop常用命令详细解释
hadoop命令分为2级,在linux命令行中输入hadoop,会提示输入规则 Usage: hadoop [--config confdir] COMMAND where COMMAND is on ...
- 机器学习之SVD分解
一.SVD奇异值分解的定义 假设是一个的矩阵,如果存在一个分解: 其中为的酉矩阵,为的半正定对角矩阵,为的共轭转置矩阵,且为的酉矩阵.这样的分解称为的奇异值分解,对角线上的元素称为奇异值,称为左奇异矩 ...
- Confluence 6 关于嵌入的 H2 数据库
你的 Confluence 安装中包含有嵌入的 H2 数据库,能够让你试用 Confluence 而不需要安装任何的外部数据库.H2 数据库仅仅用于你对 Confluence 进行评估.在你将 Con ...
- Confluence 6 自定义站点和空间布局
你可以通过编辑布局文件来修改 Confluence 的外观和感觉(也可以被称为装饰).编辑这些文件将会允许你对整个 Confluence 站点的外观和感觉进行修改或者仅仅是一个独立的空间. 当你对一个 ...