.NET 开源项目Polly的简单介绍

目录

Polly 介绍

官方对 Polly 的介绍是这样的:

Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

翻译过来大概意思是:Polly 是一个 .NET 弹性和瞬态故障处理库,允许开发人员以 Fluent 和线程安全的方式来实现重试、断路、超时、隔离和回退策略。

这个描述有点抽象,我们一起来理解一下。

首先这里的说的瞬态故障包含了程序发生的异常和出现不符合开发者预期的结果。所谓瞬态故障,就是说故障不是必然会发生的,而是偶然可能会发生的,比如网络偶尔会突然出现不稳定或无法访问这种故障。至于弹性,就是指应对故障 Polly 的处理策略具有多样性和灵活性,它的各种策略可以灵活地定义和组合。

下面来演示一个例子,大家就更清楚了。

故障处理策略示例

安惯例,创建一个空的 Console 项目,和安装 NuGet 包:

Install-Package Polly

Polly 的异常处理策略的基本用法可以分为三个步骤,步骤说明包含在下面代码中:

static void Main(string[] args)
{
    Policy
        // 1. 指定要处理什么异常
        .Handle<HttpRequestException>()
        //    或者指定需要处理什么样的错误返回
        .OrResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.BadGateway)
        // 2. 指定重试次数和重试策略
        .Retry(3, (exception, retryCount, context) =>
        {
            Console.WriteLine($"开始第 {retryCount} 次重试:");
        })
        // 3. 执行具体任务
        .Execute(ExecuteMockRequest);

    Console.WriteLine("程序结束,按任意键退出。");
    Console.ReadKey();
}

static HttpResponseMessage ExecuteMockRequest()
{
    // 模拟网络请求
    Console.WriteLine("正在执行网络请求...");
    Thread.Sleep(3000);
     // 模拟网络错误
    return new HttpResponseMessage(HttpStatusCode.BadGateway);
}

从例子中可以看到,Polly 的 API 支持流式(Fluent)调用,使用起来很方便。这个示例对错误处理的策略很简单,当发生请求异常或网络错误时,就重试 3 次。我们可以从下面的运行结果图看到这个策略的执行过程:

下面具体来看 Polly 支持的各种故障处理策略。

Polly 的七种策略

Polly 可以实现重试、断路、超时、隔离、回退和缓存策略,下面给出这些策略的应用场景说明和基本使用方法。

重试(Retry)

出现故障自动重试,这个是很常见的场景,上面也已经给出例子了,这里不再细述。

断路(Circuit-breaker)

当系统遇到严重问题时,快速回馈失败比让用户/调用者等待要好,限制系统出错的体量,有助于系统恢复。比如,当我们去调一个第三方的 API,有很长一段时间 API 都没有响应,可能对方服务器瘫痪了。如果我们的系统还不停地重试,不仅会加重系统的负担,还会可能导致系统其它任务受影响。所以,当系统出错的次数超过了指定的阈值,就要中断当前线路,等待一段时间后再继续。

下面是一个基本的断路策略的使用方式:

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

这句代码设定的策略是,当系统出现两次某个异常时,就停下来,等待 1 分钟后再继续。这是基本的用法,你还可以在断路时定义中断的回调和重启的回调。

超时(Timeout)

当系统超过一定时间的等待,我们就几乎可以判断不可能会有成功的结果。比如平时一个网络请求瞬间就完成了,如果有一次网络请求超过了 30 秒还没完成,我们就知道这次大概率是不会返回成功的结果了。因此,我们需要设置系统的超时时间,避免系统长时间做无谓的等待。

下面是超时策略的一个基本用法:

Policy.Timeout(30, onTimeout: (context, timespan, task) =>
{
    // do something
});

这里设置了超时时间不能超过 30 秒,否则就认为是错误的结果,并执行回调。

隔离(Bulkhead Isolation)

当系统的一处出现故障时,可能促发多个失败的调用,很容易耗尽主机的资源(如 CPU)。下游系统出现故障可能导致上游的故障的调用,甚至可能蔓延到导致系统崩溃。所以要将可控的操作限制在一个固定大小的资源池中,以隔离有潜在可能相互影响的操作。

下面是隔离策略的一个基本用法:

Policy.Bulkhead(12, context =>
{
    // do something
});

这个策略是最多允许 12 个线程并发执行,如果执行被拒绝,则执行回调。

回退(Fallback)

有些错误无法避免,就要有备用的方案。这个就像浏览器不支持一些新的 CSS 特性就要额外引用一个 polyfill 一样。一般情况,当无法避免的错误发生时,我们要有一个合理的返回来代替失败。

比如很常见的一个场景是,当用户没有上传头像时,我们就给他一个默认头像,这种策略可以这样定义:

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

缓存(Cache)

一般我们会把频繁使用且不会怎么变化的资源缓存起来,以提高系统的响应速度。如果不对缓存资源的调用进行封装,那么我们调用的时候就要先判断缓存中有没有这个资源,有的话就从缓存返回,否则就从资源存储的地方(比如数据库)获取后缓存起来,再返回,而且有时还要考虑缓存过期和如何更新缓存的问题。Polly 提供了缓存策略的支持,使得问题变得简单。

var memoryCacheProvider = new MemoryCacheProvider(myMemoryCache);
var cachePolicy = Policy.Cache(memoryCacheProvider, TimeSpan.FromMinutes(5));
TResult result = cachePolicy.Execute(context => getFoo(), new Context("FooKey"));

这是官方的一个使用示例用法,它定义了缓存 5 分钟过期的策略,然后把这个策略应用在指定的 Key(即 FooKey)上。

这一块内容值得用一整篇的内容来讲,下次有机会再详细讲讲 Polly 的缓存策略。

策略包(Policy Wrap)

一种操作会有多种不同的故障,而不同的故障处理需要不同的策略。这些不同的策略必须包在一起,作为一个策略包,才能应用在同一种操作上。这就是文章开头说的 Polly 的弹性,即各种不同的策略能够灵活地组合起来。

策略包的基本用法是这样的:

var policyWrap = Policy
  .Wrap(fallback, cache, retry, breaker, timeout, bulkhead);
policyWrap.Execute(...);

先是把预先定义好的多种不同的策略包在一起,作为一个整体策略,然后应用在同一个操作上。

总结

本文先是对 Polly 做了一个简单介绍,通过一个例子让大家知道了 Polly 的基本用法和步骤,然后分别介绍了 Polly 的七种策略。其实 Polly 远比本文讲的要强大,但由于篇幅的限制和精力有限,只能笼统地给大家做个介绍,更多的应用场景还需要结合实际的例子才能讲清楚。要深入研究,可以前往查看 Polly 的 GitHub 主页和 Wiki 文档。

以上就是.NET 开源项目Polly的简单介绍的详细内容,更多关于.NET 开源项目Polly的资料请关注我们其它相关文章!

(0)

相关推荐

  • .NET中开源文档操作组件DocX的介绍与使用

    前言 相信大家应该都有所体会,在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息.由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量. 在.NET项目中如果用户提出了相关文档操作的需求,开发者较多的会使用到微软自行提供的插件,在一定程度上简化了开发人员的工作量,但是同时也给用户带来了一些困扰,例如需要安装庞大的office,在用户体验性就会降低很多,并且在国内,很多人都还是使用wps,这就导致一部分只安装了wps的使用者很是为难,在对Ex

  • 详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)

    在目前的软件项目中,都会较多的使用到对文档的操作,用于记录和统计相关业务信息.由于系统自身提供了对文档的相关操作,所以在一定程度上极大的简化了软件使用者的工作量. 在.NET项目中如果用户提出了相关文档操作的需求,开发者较多的会使用到微软自行提供的插件,在一定程度上简化了开发人员的工作量,但是同时也给用户带来了一些困扰,例如需要安装庞大的office,在用户体验性就会降低很多,并且在国内,很多人都还是使用wps,这就导致一部分只安装了wps的使用者很是为难,在对Excel的操作方面,有一个NPO

  • 详解开源免费且稳定实用的.NET PDF打印组件itextSharp(.NET组件介绍之八)

    在这个.NET组件的介绍系列中,受到了很多园友的支持,一些园友(如:数据之巅. [秦时明月]等等这些大神 )也给我提出了对应的建议,我正在努力去改正,有不足之处还望大家多多包涵.在传播一些简单的知识的同时,我自己也得到了一些提升,这个是我感觉到的最大的益处.知识需要传播,在传播的过程中去让学习的人去提升,在交流中的过程中去让思考的人去展望,我希望我也能在这个传播的过程中出一份力.由于自身能力有限,在编写博文时出现的错误和一些不到位的讲解,还望大家多多见谅. 上面卖完情怀,下面就该切入正题了. 提

  • 详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)

    前面介绍了六种.NET组件,其中有一种组件是写文件的压缩和解压,现在介绍另一种文件的解压缩组件SharpZipLib.在这个组件介绍系列中,只为简单的介绍组件的背景和简单的应用,读者在阅读时可以结合官网的相关介绍和在本地实际操作. 相关的组件功能非常强大,在笔者的介绍中只是提及到简单的应用,需要了解更多的操作和特性,可以根据官网介绍,或者查看DLL文件的相关类和方法,以此来扩展相关的业务需要. SharpZipLib是一个完全在C#中为.NET平台编写的Zip,GZip,Tar和BZip2库.

  • ASP.NET开源导入导出库Magicodes.IE完成Csv导入导出的方法

    说明 本章主要说明如何使用Magicodes.IE.Csv进行Csv导入导出. 关于Magicodes.IE 导入导出通用库,通过导入导出DTO模型来控制导入和导出,支持Excel.Word.Pdf和Html. GitHub地址:https://github.com/xin-lai/Magicodes.IE 主要步骤 1.安装包Magicodes.IE.Csv Install-Package Magicodes.IE.Csv 2.使用Magicodes.IE.Csv导出Csv 通过如下代码片段我

  • .NET 开源配置组件 AgileConfig的使用简介

    介绍 在微服务大行其道的今天,系统会被拆分成多个模块,作为单独的服务运行,同时为了集中化管理,我们还需要日志中心,配置中心等,很多开发人员可能更熟悉 ApolloConfig,这个组件功能也很完善,dotnet的客户端也主要是国人在维护和开发,之前公司就是选型的Apollo,而且也在生产环境稳定运行,但是服务端是Java的,而且部署服务端也有些麻烦. 今天主要介绍 AgileConfig,这是一个基于.net core开发的轻量级配置中心,之前跟作者也有过沟通,也很热情帮忙解决问题,它的特点有部

  • 详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)

    在生活中有一种东西几乎已经快要成为我们的另一个电子"身份证",那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) ,又称二维条码,是在一维条码的基础上扩展出的一种具有可读性的条码.设备扫描二维条码,通过识别条码的长度和宽度中所记载的二进制数据,可获取其中所包含的信息.相比一维条码,二维码记载更复杂的数据,比如图片.网络链接等. 今天介绍一种免费开源的二维码操作组件,ThoughtWorks.QRCode

  • 基于.NET平台常用的框架和开源程序整理

    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继续补充这篇日志,日积月累,就能形成一个自己的组件经验库. 分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度. Redis:是一个高性能的KV数据库. 它的出现很大程度补偿了Mem

  • 详解最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是使用者对于文件压缩的好处都是深有体会.至于文件压缩的原理,在我的另一篇博客中有简单的介绍,在这里就不再做介绍,需要了解的可以查看. .NET在System.IO.Compression命名空间中提供了GZip.Defalate两种压缩算法.今天我要介绍的一种压缩组件是DotNetZip组件. 一.D

  • 详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有"内置"定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对的问题:计时器没有持久化机制:计时器具有不灵活的计划(仅能设置开始时间和重复间隔,没有基于日期,时间等):计时器不使用线程池(每个定时器一个线程):计时器没有真正的管理方案 - 你必须编写自己的机制,以便能够记住,组织和检索任务的名称等. 如果需要在.NET实现定时器的功能,可以尝试使用以

随机推荐