介绍

本节我们来介绍一款强大的库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的更多相关文章

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

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

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

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

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

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

  4. 【微服务No.2】polly微服务故障处理库

    熔断.降级: 熔断:熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地常识执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也 ...

  5. .NET的弹性及瞬间错误处理库Polly

    原文:.NET的弹性及瞬间错误处理库Polly 本文基本是官方说明的翻译和总结(https://github.com/App-vNext/Polly) 什么是Polly? Polly是一款基于.NET ...

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

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

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

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

  8. ASP VNext 开源服务容错处理库Polly使用文档

    在进入SOA之后,我们的代码从本地方法调用变成了跨机器的通信.任何一个新技术的引入都会为我们解决特定的问题,都会带来一些新的问题.比如网络故障.依赖服务崩溃.超时.服务器内存与CPU等其它问题.正是因 ...

  9. 容错处理库Polly使用文档

    Design For Failure1. 一个依赖服务的故障不会严重破坏用户的体验.2. 系统能自动或半自动处理故障,具备自我恢复能力. 以下是一些经验的服务容错模式 超时与重试(Timeout an ...

随机推荐

  1. FAT文件系统规范v1.03学习笔记---2.FAT区之FAT数据结构(Fat Data Structure)

    1.前言 本文主要是对Microsoft Extensible Firmware Initiative FAT32 File System Specification中文翻译版的学习笔记. 每个FAT ...

  2. matlab处理手写识别问题

    初学神经网络算法--梯度下降.反向传播.优化(交叉熵代价函数.L2规范化) 柔性最大值(softmax)还未领会其要义,之后再说 有点懒,暂时不想把算法重新总结,先贴一个之前做过的反向传播的总结ppt ...

  3. 使用cstdiofile在vs2010中无法写入中文的问题

    在VC2010环境下, 以下代码无法实现使用CStdioFile向文本文件中写入中文(用notepad.exe查看不到写入的中文) CStdioFile file; file.Open(…); fil ...

  4. mysql数据库基于linux的安装步骤及数据库操作

    一.数据库安装 Ubuntu上安装MySQL非常简单只需要几条命令就可以完成. sudo apt-get install mysql-server sudo apt-get isntall mysql ...

  5. ubuntu安装Qt

    一.安装 卸载旧版本Qt,找到安装目录,例如:/home/likewei/Qt5.11.2,终端输入命令进入该目录,输入命令:./MaintenanceTool      进入图形画面卸载就行了 1. ...

  6. ansible和python的zabbix_api批量添加rsync服务的监控

    一.正常的处理流程: 1.添加zabbix用户对rsync程序的sudo权限,且不需要输入密码 # visudo即在/etc/sudoers配置文件最后添加如下内容 Defaults:zabbix ! ...

  7. Struts2,springMVC获取request和response

    springMVC获取request和response1:在BaseController中加入: protected HttpServletRequest request;   protected H ...

  8. scrapy 在迭代爬取时被拒 offsite 增加dont_filter=True

  9. 小甜点,RecyclerView 之 ItemDecoration 讲解及高级特性实践

    本篇文章摘自微信公众号 guolin_blog (郭霖)独家发布 毫无疑问,RecyclerView 是现在 Android 世界中最重要的系统组件之一,它的出现就是为了高效代替 ListView 和 ...

  10. Oracle数据库内存使用情况分析查看

    SGA.PGA使用情况 select name,total,round(total-free,2) used, round(free,2) free,round((total-free)/total* ...