.NET弹性和瞬时处理库Polly:理解并实现七种策略

这篇具有很好参考价值的文章主要介绍了.NET弹性和瞬时处理库Polly:理解并实现七种策略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

Polly 的七种策略介绍

重试(Retry): 当出现故障时自动进行重试
断路(Circuit-breaker):当系统遇到严重问题时,快速回馈失败比让用户/调用者等待要好,限制系统出错的体量,有助于系统恢复。
超时(Timeout):当系统超过一定时间的等待,我们就几乎可以判断不可能会有成功的结果,直接去干别的事情。
隔离(Bulkhead Isolation):当系统的一处出现故障时,可能促发多个失败的调用,很容易耗尽主机的资源(如 CPU)。下游系统出现故障可能导致上游的故障的调用,甚至可能蔓延到导致系统崩溃。所以要将可控的操作限制在一个固定大小的资源池中,以隔离有潜在可能相互影响的操作。
回退(Fallback):有些错误无法避免,就要有备用的方案。这个就像浏览器不支持一些新的 CSS 特性就要额外引用一个 polyfill 一样。一般情况,当无法避免的错误发生时,我们要有一个合理的返回来代替失败。
缓存(Cache):一般我们会把频繁使用且不会怎么变化的资源缓存起来,以提高系统的响应速度。如果不对缓存资源的调用进行封装,那么我们调用的时候就要先判断缓存中有没有这个资源,有的话就从缓存返回,否则就从资源存储的地方(比如数据库)获取后缓存起来,再返回,而且有时还要考虑缓存过期和如何更新缓存的问题。Polly 提供了缓存策略的支持,使得问题变得简单。
策略包(Policy Wrap):一种操作会有多种不同的故障,而不同的故障处理需要不同的策略。这些不同的策略必须包在一起,作为一个策略包,才能应用在同一种操作上。这就是文章开头说的 Polly 的弹性,即各种不同的策略能够灵活地组合起来。

通过NuGet安装Polly类库:

.NET,Polly,弹性处理,瞬时故障处理

官方项目地址: https://github.com/App-vNext/Polly 

代码实现

    /// <summary>
    /// FallBack => 当出现故障,则进入降级动作
    /// </summary>
    public static void Case1()
    {
        ISyncPolicy policy = Policy.Handle<ArgumentException>()
            .Fallback(() =>
            {
                Console.WriteLine("Error occured");
            });

        policy.Execute(() =>
        {
            Console.WriteLine("Job Start");

            throw new ArgumentException("Hello Polly!");

            Console.WriteLine("Job End");
        });
    }

    /// <summary>
    /// Retry => 重试
    /// </summary>
    public static void Case2()
    {
        ISyncPolicy policy = Policy.Handle<Exception>().Retry(3);

        try
        {
            policy.Execute(() =>
            {
                Console.WriteLine("Job Start");
                if (DateTime.Now.Second % 10 != 0)
                {
                    throw new Exception("Special error occured");
                }
                Console.WriteLine("Job End");
            });
        }
        catch (Exception ex)
        {
            Console.WriteLine("There's one unhandled exception : " + ex.Message);
        }
    }

    /// <summary>
    /// CircuitBreaker => 短路保护
    /// </summary>
    public static void Case3()
    {
        // Stop for 10s after retry 6 times
        ISyncPolicy policy = Policy.Handle<Exception>()
            .CircuitBreaker(6, TimeSpan.FromSeconds(10));

        while (true)
        {
            try
            {
                policy.Execute(() =>
                {
                    Console.WriteLine("Job Start");
                    throw new Exception("Special error occured");
                    Console.WriteLine("Job End");
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine("There's one unhandled exception : " + ex.Message);
            }

            Thread.Sleep(500);
        }
    }

    /// <summary>
    /// Timeout 与 Wrap => Wrap是指策略封装,可以把多个ISyncPolicy合并到一起执行。Timeout则是指超时处理,但是超时策略一般不能直接使用,而是其其他策略封装到一起使用。
    /// </summary>
    public static void Case4()
    {
        try
        {
            ISyncPolicy policyException = Policy.Handle<TimeoutRejectedException>()
                .Fallback(() =>
                {
                    Console.WriteLine("Fallback");
                });
            ISyncPolicy policyTimeout = Policy.Timeout(3, Polly.Timeout.TimeoutStrategy.Pessimistic);
            ISyncPolicy mainPolicy = Policy.Wrap(policyTimeout, policyException);
            mainPolicy.Execute(() =>
            {
                Console.WriteLine("Job Start...");
                Thread.Sleep(5000);
                throw new Exception(); 
                Console.WriteLine("Job End...");
            });
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Unhandled exception : {ex.GetType()} : {ex.Message}");
        }
    }

    /// <summary>
    /// 异步方法
    /// </summary>
    public static async void Case5()
    {
        var policy = Policy<byte[]>.Handle<Exception>()
            .FallbackAsync(async c =>
            {
                Console.WriteLine("Executed Error!");
                return new byte[0];
            }, async r =>
            {
                Console.WriteLine(r.Exception);
            });

        policy.WrapAsync(Policy.TimeoutAsync(5, TimeoutStrategy.Pessimistic,
         async (context, timespan, task) =>
         {
             Console.WriteLine("Timeout!");
         }));

        var bytes = await policy.ExecuteAsync(async () =>
        {
            Console.WriteLine("Start Job");
            HttpClient httpClient = new HttpClient();
            var result = await httpClient.GetByteArrayAsync("https://img-blog.yssmx.com/img_convert/50f2b9069f40b88ea8348492d56abb87.png");
            Console.WriteLine("Finish Job");

            return result;
        });

        Console.WriteLine($"Length of bytes : {bytes.Length}");
    }

调用示例

Case1:

.NET,Polly,弹性处理,瞬时故障处理

Case2: 

.NET,Polly,弹性处理,瞬时故障处理 

 Case3:

.NET,Polly,弹性处理,瞬时故障处理文章来源地址https://www.toymoban.com/news/detail-812069.html

到了这里,关于.NET弹性和瞬时处理库Polly:理解并实现七种策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微服务】04-Polly实现失败重试和限流熔断

    1.1 Polly组件包 Polly Polly.Extensions.Http Microsoft.Extensions.Http.Polly 1.2 Polly的能力 失败重试 服务熔断 ⇒ 部分服务不可用时,可以快速响应熔断,避免持续请求不可用服务而导致整个应用程序宕掉 超时处理 ⇒ 请求响应超过设置的时间,可按照预定的操作进行处理 舱壁隔离 ⇒ 为服

    2024年02月11日
    浏览(16)
  • 弹性数据库连接池探活策略调研(一)——HikariCP

    数据库连接建立是比较昂贵的操作(至少对于 OLTP),不仅要建立 TCP 连接外还需要进行连接鉴权操作,所以客户端通常会把数据库连接保存到连接池中进行复用。连接池维护到弹性数据库(JED)的长连接,弹性数据库默认不会主动关闭客户端连接(除非报错),但一般客户端

    2024年02月10日
    浏览(19)
  • 微服务应用视角解读如何选择K8S的弹性策略

    微服务架构的出现,拆分了庞大的单体应用,让业务之间的开发与协作变得更加灵活。当面临业务流量增加的场景时,往往需要对一些应用组件进行扩容。K8S在应用层面提供了HPA,围绕HPA开源社区延伸出了KEDA这样的弹性组件,为微服务应用以业务指标执行弹性策略提供了实现

    2024年02月02日
    浏览(12)
  • 机器学习之弹性网络(Elastic Net)

    代码原文 下面代码参考scikit-learn中文社区,链接在上面。 但是由于scikit-learn中文社区上的代码有些地方跑不通,故对此代码做了修改,输出结果与社区中显示的结果相同。 对弹性网络进行简单的介绍: ElasticNet是一个训练时同时用ℓ1和ℓ2范数进行正则化的线性回归模型,

    2024年02月14日
    浏览(20)
  • 【能量算子】评估 EEG 中的瞬时能量:非负、频率加权能量算子(Python&Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Python、Matlab代码实现

    2024年02月08日
    浏览(20)
  • 一文理解云计算中的弹性伸缩

    作者:禅与计算机程序设计艺术 “云计算”已经成为热门话题。从最早的小型机到现在的大型集群服务器、分布式系统,云计算越来越受到青睐,对企业业务快速响应和创新发展,带动着新一代信息化服务的革命。但同时,云计算也面临着新的挑战。在面对海量数据时如何处

    2024年02月09日
    浏览(19)
  • 4.设计模式之后七种模式后11种模式命令访问者迭代器发布订阅中介者忘备录解释器状态策略职责链和空模式

    1.命令(command)模式 不知道命令接收者(对象)是谁,支持撤销 (接受者 间接调用执行 的具体行为) 命令调用者和接收者解耦 //只要实现命令接口即可 (就是客户端给个命令,然后命令类传给接收类执行) 优点和缺点 容易撤销操作 命令队列可以多线程操作 增加过多的命令类 空命令也

    2024年02月12日
    浏览(22)
  • 【腾讯云 TDSQL-C Serverless 产品测评】深度实测TDSQL-C Serverless 弹性伸缩策略及稳定性

    Serverless 数据库作为近几年云原生数据库领域的重要发展方向,自 2018 年 AWS 率先推出 Aurora Serverless MySQL 服务,打响 Serverless 数据库之战的第一枪以来,各大云平台厂商一直在该领域不断深耕探索。9 月 7 日,在 2023 腾讯全球数字生态大会云原生数据库技术演进与实践专场上,

    2024年02月08日
    浏览(20)
  • ASP.Net实现海鲜添加(三层架构,异常处理)

    点击启动生成页面 点击添加跳转新界面  此处设置文本框多行 点击Button添加 下图是三层架构列表,Models里面有模拟数据库中列的类,DAL中有DBHelper和service,BLL中有BllManager文件用于ui界面直接调用 建照片文件图片,数据夹用于展示库存地址  DAL引用Models文件,BLL引用DAL和Mode

    2024年02月03日
    浏览(16)
  • 阿里云弹性云桌面安装失败问题解决记录(.net framework 4.6.2 or later:Error Code: 12029)

    1,问题 图像显示客户端安装错误     然后我就手动下载了,这个文件 下载好之后是这个文件     然后安装一下就报了这个错误 .net framework 4.6.2 or later:Error Code: 12029 这个问题是.net framework 4.6.2文件有问题,把他重新安装就好了 然后又发现.net framework 4.6.2安装不了 解决了这个

    2024年02月06日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包