.Net弹性和瞬态故障处理库Polly介绍

下面就给您详细讲解一下".Net弹性和瞬态故障处理库Polly介绍",这是一款.net生态中十分优秀的库,能够让开发者更好的处理瞬态故障和弹性处理,提高开发效率和用户体验。

Polly简介

什么是Polly?

Polly(Polly.Extensions.Http)基于.NET Standard和.NET Core。Polly是.NET弹性和瞬态故障处理库,快速、稳定、健壮的处理您的应用程序的故障。Polly允许执行重试、熔断、断路器和超时等削弱策略。

主要功能

  • Retries:执行一个操作时,如果该操作失败,Polly可以在一定数量或一定时间内对该操作进行重试。

  • Circuit-Breaker:当应用程序中的一个组件失败时,断路器模式可以停止该组件的调用,并检测该操作是否可以重试。

  • Fallbacks:如果发生失败,Polly可以从备选聚合中取回数据。

  • Time-outs:为进行故障尝试的期间设置超时限制。

Polly入门

引入Polly

Polly是通过NuGet引入的,在Visual Studio中,可以通过NuGet包控制台或NuGet包管理器,或者手动修改项目文件的方式安装,在本文中,我们使用NuGet包管理器安装Polly,输入以下命令:

Install-Package Polly
Install-Package Polly.Extensions.Http

安装好了之后,就可以在代码中使用Polly的特性了。

使用Polly

下面我们将会对Polly进行简单的Demo演示,来帮助您更好的了解Polly的使用方法。

例如,现在我们有一个方法,它必须尝试3次后才能成功,如果前3次都失败了,那么就抛出失败信息。

private static async Task<string> SearchGoogle()
{
    var retryCount = 3;//最多重试3次
    var delay = TimeSpan.FromSeconds(3);//3秒后重试
    var policy = Policy
        .Handle<Exception>()
        .WaitAndRetryAsync(retryCount, i => delay);//定义Policy

    return await policy.ExecuteAsync(async () =>
    {
        using var httpClient = new HttpClient();
        var response = await httpClient.GetAsync("https://www.google.com");
        return await response.Content.ReadAsStringAsync();
    });
}

上面代码中,我们使用了WaitAndRetryAsync()方法,传入一个重试次数和一个TimeSpan参数来确定重试时间间隔,当出现Exception异常时,执行重试逻辑。

此外,您也可以使用CircuitBreakerPolicy来定义断路器等。

var circuitBreakerPolicy = Policy
    .Handle<HttpRequestException>()    //定义需要熔断的异常类型
    .CircuitBreaker(3, TimeSpan.FromSeconds(10), 
        (exception, duration) =>
        {
            Console.WriteLine($"打开断路器, 抛出异常: {exception.Message}, 将持续 {duration.Seconds}s.");
        },
        () =>
        {
            Console.WriteLine("断路器关闭");
            //断路器重置了
        });

上面这个例子是定义一个熔断器,当某个HTTP请求发生了3次异常时,会将该服务节点标记为不可用状态,并输出相关信息。注意:需要注意的是,在我们使用断路器的同时,还要注意熔断器是有状态的,在失败3次后会将运行状态设置为断开,因此在熔断关闭之前,操作始终不会执行。

示例

示例1:Polly的WaitAndRetryAsync()方法

 static async Task Main(string[] args)
 {
     await Task.Run(() => OnStart());
     Console.ReadLine();
 }

 static async Task OnStart()
 {
     var retryCount = 3;//最多重试3次
     var delay = TimeSpan.FromSeconds(3);//3秒后重试
     var policy = Policy
         .Handle<Exception>()
         .WaitAndRetryAsync(retryCount, i => delay);//定义Policy

     await policy.ExecuteAsync(async () =>
     {
         using var httpClient = new HttpClient();
         var response = await httpClient.GetAsync("https://www.baidu.com/home/msg/data/personalcontent");
         var json = await response.Content.ReadAsStringAsync();
         Console.WriteLine(json);//输出请求结果
     });
 }

从上面的代码示例可以看出,我们在使用了WaitAndRetryAsync()方法时,使用了一个策略(Policy),它能够按照特定的步奏执行当前方法,达到了性能优化的优化目的,这是比较实用的一个设计。在某些情况下,可以非常快速的在多种数据中完成多次请求的操作,并在执行完成后及时对客户端进行响应。

示例2:CircuitBreakerPolicy的使用

下面是一个对http请求进行熔断的示例

static async Task Main(string[] args)
{
    await Task.Run(() => OnStart());
    Console.ReadLine();
}

static async Task OnStart()
{
    var circuitBreakerPolicy = Policy
    .Handle<HttpRequestException>()    //定义需要熔断的异常类型
    .CircuitBreaker(3, TimeSpan.FromSeconds(10), 
        (exception, duration) =>
        {
            Console.WriteLine($"打开断路器, 抛出异常: {exception.Message}, 将持续 {duration.Seconds}s.");
        },
        () =>
        {
            Console.WriteLine("断路器关闭");
            //断路器重置了
        });

    await circuitBreakerPolicy.ExecuteAsync(async () =>
    {
        using var httpClient = new HttpClient();
        var response = await httpClient.GetAsync("https://www.baidu.com/home/msg/data/personalcontent");
        var json = await response.Content.ReadAsStringAsync();
        Console.WriteLine(json);
    });

}

从上面示例可以看出,通过熔断器的运作可以有效的保证我们当前请求的可用性,并在此过程中获得更高的处理效果。这也是POLLY框架被广大开发者青睐的原因之一。

同时,Polly还具有简化代码和优化代码效果,提高了程序的可靠性,确保了程序的稳定性,大大的缩短了我们的开发时间,提升程序的灵活性和可维护性,适合在大型.NET项目中应用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net弹性和瞬态故障处理库Polly介绍 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • CodeBuilder 3 预览版发布

    CodeBuilder是一款强大的代码生成工具,目前发布了 3.0 preview 2,大家可以前去下载体验 官方主页。 1、多种数据源 基于 ADO.NET 的数据驱动 基于 Fireasy 3,支持从 SqlServer、MySql、Oracle、Firebird、PostgreSql、SQLite、达梦、人大金仓、神通数据库,以及 OleDb 驱动。可…

    C# 2023年4月22日
    00
  • Silverlight融合ajax实现前后台数据交互

    Silverlight融合ajax实现前后台数据交互 Silverlight是一种基于.NET Framework的浏览器插件,可以用于创建丰富的互联网应用程序。在Silverlight应用程序中,可以使用ajax技术来实现前后台数据交互。本文将提供详细的“Silverlight融合ajax实现前后台数据交互”的完整攻略,包括如何使用ajax技术来实现前后台…

    C# 2023年5月15日
    00
  • C#控制键盘按键的常用方法

    C#控制键盘按键的常用方法 C#是一种通用的、面向对象的编程语言,常用于开发Windows应用程序。在Windows应用程序中,控制键盘按键是非常常见的操作,因此掌握C#控制键盘按键的常用方法是非常必要的。 本文将介绍几种控制键盘按键的常用方法,包括SendKeys类、keybd_event函数和InputSimulator类。 使用SendKeys类 Se…

    C# 2023年6月1日
    00
  • C# 大数据导出word的假死报错的处理方法

    标题:C#大数据导出word的假死报错的处理方法 问题描述 在C#大数据导出Word时,当数据量过大时,容易出现程序假死或报错的情况,影响用户体验。本文将分享如何处理这类问题。 解决方法 分段处理数据: 由于数据量太大会导致程序假死,实际上这是在内存中加载数据太多造成的,所以可以考虑将数据分段处理,比如每次只处理1000条数据,这样即使数据量过大也可以较快的…

    C# 2023年5月14日
    00
  • js实现C#的StringBuilder效果完整实例

    下面就是详细讲解“js实现C#的StringBuilder效果完整实例”的攻略: 1. 概述 String 类是 JavaScript 中非常重要的内置类,我们在编程中常常需要处理大量字符串的拼接,常见的做法是使用 + 运算符或者字符串模板等。但是这种方法在处理大量字符串时会极大降低性能,并且难以维护。 这时,我们可以使用类似于 C# 中的 StringBu…

    C# 2023年6月7日
    00
  • C# Word 类库的深入理解

    下面我会详细讲解一下“C# Word类库的深入理解”的攻略。 1. Word类库概述 C# Word类库可以让我们通过编程方式操作Word文档。在使用C# Word类库之前需要先引入插件:Microsoft.Office.Interop.Word。该插件提供了对Word文档的操作接口。通过该插件,我们可以创建和修改Word文档,并实现一些自动化操作。 2. …

    C# 2023年5月15日
    00
  • 十进制负数转换为二进制、八进制、十六进制的知识分享

    下面是关于“十进制负数转换为二进制、八进制、十六进制”的详细讲解。 一、前置知识 在进行负数的进制转换前,需要了解以下几点: 1.原码 原码是一个二进制数的最高位表示这个数的符号,为 0 代表正数,为 1 代表负数。其余各位位数表示这个数的绝对值的二进制数。如以下几个数的原码:+1 的原码:00000001-1 的原码:10000001+5 的原码:0000…

    C# 2023年6月8日
    00
  • C#解决SQlite并发异常问题的方法(使用读写锁)

    让我来详细讲解“C#解决SQlite并发异常问题的方法(使用读写锁)”的完整攻略。 什么是SQlite并发异常问题 SQlite是一个非常流行的轻量级数据库,但由于其特殊的设计,使得它在并发访问时容易引发异常问题。例如,如果多个线程同时进行写操作,很容易引发数据被覆盖的情况,从而导致数据的不一致。 解决SQlite并发异常问题的方法 为了解决这个问题,我们可…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部