iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.NET 开源项目Polly的简单介绍
  • 580
分享到

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

2024-04-02 19:04:59 580人浏览 泡泡鱼
摘要

目录Polly 介绍 故障处理策略示例 Polly 的七种策略 重试(Retry) 断路(Circuit-breaker) 超时(Timeout) 隔离(Bulkhead Isola

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的资料请关注编程网其它相关文章!

--结束END--

本文标题: .NET 开源项目Polly的简单介绍

本文链接: https://www.lsjlt.com/news/128281.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • .NET 开源项目Polly的简单介绍
    目录Polly 介绍 故障处理策略示例 Polly 的七种策略 重试(Retry) 断路(Circuit-breaker) 超时(Timeout) 隔离(Bulkhead Isola...
    99+
    2024-04-02
  • PHP简化开发项目介绍
    本篇内容介绍了“PHP简化开发项目介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!0. CakePHP Development Frame...
    99+
    2023-06-17
  • 简单介绍我的开源小工具:SanicDB
    SanicDB 是为 Python的异步 Web 框架 Sanic 方便操作MySQL而开发的工具,是对 aiomysql.Pool 的轻量级封装。Sanic 是异步IO的Web框架,同时用异步IO读写MySQL才能更大发挥它的效率。虽然...
    99+
    2023-01-30
    开源 小工具 简单
  • .net中的DI框架AutoFac简单介绍
    AutoFac是.net程序下一个非常灵活易用,且功能强大的DI框架,本文这里简单的介绍一下使用方法。 安装: Install-Package Autofac 简单的示例: stat...
    99+
    2024-04-02
  • .NET 开源配置组件 AgileConfig的使用简介
    目录介绍架构图部署服务端在客户端程序使用总结介绍 在微服务大行其道的今天,系统会被拆分成多个模块,作为单独的服务运行,同时为了集中化管理,我们还需要日志中心,配置中心等,很多开发人...
    99+
    2024-04-02
  • 介绍Go语言的设计与实现及Github开源项目
    Go语言设计与实现Github近年来,随着Web应用的快速发展和云计算的广泛应用,Go语言已成为众多开发者的首选。作为一门静态类型编程语言,Go语言在编译速度、并发能力、代码可读性等方面优势明显,因此备受关注。本文将介绍Go语言的设计与实现...
    99+
    2023-10-22
  • 不容错过的精华:Go语言开源项目Top5简介
    Go语言是一种编译型的静态类型语言,由谷歌开发并于2009年首次公开。自公开以来,Go语言凭借其简洁、高效、安全以及并发性能等优势,迅速走红并得到广泛应用。作为开源项目的一部分,Go语言的生态系统也在不断壮大...
    99+
    2024-01-30
    Go语言 开源项目 精华
  • AJAX技术的简单介绍
    这篇文章主要讲解了“AJAX技术的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“AJAX技术的简单介绍”吧!AJAX模式 许多重要的技术和AJAX开...
    99+
    2024-04-02
  • python中的json简单介绍
    这篇文章主要讲解了“python中的json简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的json简单介绍”吧! ...
    99+
    2024-04-02
  • JavaScript闭包的简单介绍
    本篇内容主要讲解“JavaScript闭包的简单介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript闭包的简单介绍”吧!什么是JS闭包?先看一...
    99+
    2024-04-02
  • C#线程的简单介绍
    本篇内容介绍了“C#线程的简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#线程是什么呢?在操作系统中一个进程至少要包含一个线程,然...
    99+
    2023-06-17
  • CSS中Sprites的简单介绍
    本篇内容介绍了“CSS中Sprites的简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!HTML代码...
    99+
    2024-04-02
  • Orchard架构的简单介绍
    这篇文章主要讲解了“Orchard架构的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Orchard架构的简单介绍”吧!  对于我们来说,更重要的是...
    99+
    2024-04-02
  • scrapy框架的简单介绍
    这篇文章主要介绍“scrapy框架的简单介绍”,在日常操作中,相信很多人在scrapy框架的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”scrapy框架的简单介绍”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • PyTorch中的torch.cat简单介绍
    目录1.toych简单介绍2.张量Tensors3.torch.cat1.toych简单介绍 包torch包含了多维疑是的数据结构及基于其上的多种数学操作。 torch包含了多维张量...
    99+
    2024-04-02
  • python描述符的简单介绍
    这篇文章主要介绍“python描述符的简单介绍”,在日常操作中,相信很多人在python描述符的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python描述符的简单介绍”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-01
  • mysql prompt命令的简单介绍
    这篇文章主要介绍“mysql prompt命令的简单介绍”,在日常操作中,相信很多人在mysql prompt命令的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”my...
    99+
    2024-04-02
  • Redis数据库的简单介绍
    这篇文章给大家分享的是有关Redis数据库的简单介绍的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1.Redis数据库介绍redis数据库是一种基于内存可持久化的键值对非关系性数...
    99+
    2024-04-02
  • ceRNA数据库的简单介绍
    这篇文章主要介绍“ceRNA数据库的简单介绍”,在日常操作中,相信很多人在ceRNA数据库的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ceRNA数据库的简单介绍”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-19
  • PostgreSQL中的数组简单介绍
    本篇内容介绍了“PostgreSQL中的数组简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!假设你在...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作