首页 程序笔记 Polly瞬态故障处理熔断降级用法

Polly瞬态故障处理熔断降级用法

Polly是一个被.NET基金会认可的弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试,断路,超时,故障恢复等策略,其主要功能如下:重试(Retry)断路器(Circuit-Breaker)超时检测(Timeout)缓存(Cache)降级(Fallback)。

首先通过NuGet安装Polly,我当前使用的是最新7.2.1版本的Polly。

Polly的基本使用方法:定义故障,当发生了HttpRequestException异常的时候,就会触发策略。指定策略。

以下示例代码,定义了在执行某业务代码时如果出现HttpRequestException异常就是出现故障,会触发降级策略。

Policy.Handle<HttpRequestException>().
                Fallback(()=> { 
                    // 降级方法
                }).Execute(()=> {
                    // 业务方法,一般是跨服务的调用,可以合HttpClient结合使用
                    throw new HttpRequestException();
                });

Polly故障的定义方法

// 单个异常的故障
Policy.Handle<Exception>();
// 带条件的异常类型
Policy.Handle<Exception>(ex => ex.Message.Contains("xxx"));
// 多个异常类型带条件
Policy.Handle<HttpRequestException>(ex => ex.Message.Contains("xxx"))
.Or<ArgumentException>()
.Or<NetworkInformationException>();

注意:Polly是故障处理库,一般定义服务调用环节产生的不可控的异常作为故障(请求出错等不可控的异常)。业务代码出现异常不需要Polly。

Polly弹性策略

// 默认重试一次
Policy.Handle<Exception>().Retry();//.Execute(() => { });
// 重试N次
Policy.Handle<Exception>().Retry(3, (ex, i) =>
{
    //委托,可以做一些日志记录等操作
});
// 无限重试直到成功(不推荐)
Policy.Handle<Exception>().RetryForever();
// 重试且等待
Policy.Handle<Exception>().WaitAndRetry(new[] {
    TimeSpan.FromSeconds(1),
    TimeSpan.FromSeconds(1),
    TimeSpan.FromSeconds(1)
});
// 重试且等待2的i(次数)次方
Policy.Handle<Exception>().WaitAndRetry(3, i => TimeSpan.FromSeconds(Math.Pow(2, i)));
// 每一种策略最后一个参数都是一个委托,这个委托就是异常委托
// 断路器,非常使用的策略
// 连续触发了指定(2)次数的故障后,就开启断路器(OPEN),进入熔断状态,1分钟
// 断路器有三种状态,OPEN CLOSED HALF-OPEN
var breaker = Policy.Handle<HttpRequestException>().CircuitBreaker(2, TimeSpan.FromMinutes(1),
    (exception,span)=> { },//OPEN 断路器开启
    ()=> { });//CLOSE 断路器关闭
//breaker.CircuitState = Polly.CircuitBreaker.CircuitState.Closed;
//breaker.CircuitState = Polly.CircuitBreaker.CircuitState.HalfOpen;
//breaker.CircuitState = Polly.CircuitBreaker.CircuitState.Open;
// 这个不是断路器模式的状态,这个是Polly断路器策略里的一种特殊状态
// 手动的打开断路器,断路器:手动开启状态
//breaker.CircuitState = Polly.CircuitBreaker.CircuitState.Isolated;
// 手动开启断路器,断路器默认是关闭的
breaker.Isolate();
// 手动关闭断路器
breaker.Reset();
// 如果再故障采样持续时间内,导致处理异常的操作的比例超过故障阈值,则发生熔断
// 前提是再次期间,通过断路器的操作的数量至少是最小吞吐量
Policy.Handle<HttpRequestException>().AdvancedCircuitBreaker(
    0.5,// 故障阈值,50%
    TimeSpan.FromSeconds(10),// 故障采样时间,10秒
    8,// 最小吞吐量,10秒内最少执行了8次操作
    TimeSpan.FromSeconds(30)// 熔断时间,30秒
    );
// 熔断30秒后,变成HALF-OPEN,半开启状态,
// 断路器会尝试着释放(1次)操作,如果成功就变成CLOSE,如果失败断路器打开OPEN(30秒)

// 超时,服务调用慢也是故障,自己定义n秒
// 不会用单独策略,只会用策略组合
// 超时不需要定义故障
Policy.Timeout(3, (context, span, arg3, arg4) =>
{
    // arg4 is TimeoutRejectedException
    // 委托可选
}).Execute(() => { });
// 舱壁隔离,通过控制并发数量来管理负载。主动式策略也不需要定义故障
// 最大并发数12,超过12的都拒绝掉
Policy.Bulkhead(12).Execute(()=> { });
// 超过12个的最多20个等待
Policy.Bulkhead(12,20).Execute(() => { });

// 缓存比较复杂,以来其他库,集合Redis
// Policy.Cache()

Polly策略包装 策略组合

// 降级策略
var fullback = Policy.Handle<Exception>().
    Fallback(() =>
    {
        Console.WriteLine("Polly Fallback!");
    });
// 重试策略
var retry = Policy.Handle<Exception>().Retry(3, (ex, i) =>
{
    Console.WriteLine($"retryCount:{i}");
    //委托,可以做一些日志记录等操作
});
// 如果重试3次仍然发生故障就降级
var policy = Policy.Wrap(fullback, retry);
policy.Execute(() => {
    Console.WriteLine("Polly Begin");
    throw new Exception("Error");
});

策略组合运行结果:

站心网

Polly是一个被.NET基金会认可的弹性和瞬态故障处理库,允许我们以非常顺畅和线程安全的方式来执诸如行重试..

为您推荐

.NET C#中的Func、Predicate和Expression用法详解

在 .NET C# 中,Func、Predicate 和 Expression 是非常常见的委托类型和表达式树,广泛用于函数式编程、数据查询(如 LINQ)以及表达式编译等场景。以下是它们的详细用法和区别。1. FuncFunc 是一个通用委托,用于表..

SQL语句中的EXISTS用法示例

EXISTS 是 SQL 中用于判断子查询是否返回结果的关键字。它通常用于 WHERE 子句中,结合子查询一起使用。如果子查询返回至少一行数据,EXISTS 会返回 TRUE,否则返回 FALSE。EXISTS 用法示例假设有两个表:employees..

5个高性能 .NET Core 图片处理库推荐

在使用 .NET Core 开发中,图片处理是一个常见需求,如图像缩放、裁剪、格式转换和添加水印等。以下是一些推荐的 .NET Core 图片处理库,它们功能强大且支持多种图像处理功能:1. ImageSharp简介:ImageSharp 是一个..

.NET 使用HttpClientFactory+Polly替代直接使用HttpClient

在 .NET 开发中,了解如何发出高效、可靠且可伸缩的 Web 请求至关重要。曾几何时,在 .NET 的土地上,开发人员习惯于发出 Web 请求。这很简单:var client = new HttpClient();var response = await client.GetAsync..

高效且灵活的C++库Vince's CSV Parser用法示例

在当今的软件开发中,数据的处理和分析占据了核心地位。而CSV(逗号分隔值)文件格式因其简洁性和广泛的兼容性,成为数据交换的常用格式。然而,处理CSV文件并非易事,尤其是当文件规模庞大或格式复杂时。为了解决这..

PDFiumCore | .NET Core PDF 处理渲染库

在处理 PDF 文件时,渲染和解析的准确性、速度和稳定性是至关重要的。PDFiumCore,作为.NET 环境下的一个强大库,为开发者提供了高效、便捷的 PDF 处理能力。PDFiumCore 是基于 Foxit Software 的 PDFium 库的一个封..

AutoMapper.AutoMapperMappingException”类型的异常在 AutoMapper.dll 中发生,但未在用户代码中进行处理

今天修改别人的代码抛出了这样的异常: AutoMapper.AutoMapperMappingException&rdquo;类型的异常在 AutoMapper.dll 中发生,但未在用户代码中进行处理。进行了调试,往下走的时候直接报错了,百度之~中文网站上没..

c# ThreadPool使用方法

ThreadPool类提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。 线程池通过为应用程序提供一个由系统管理的辅助线程池使您可以更为有效地使用线程。一个线程监视排到线程..

c#.net字符串处理方法

1.字符串比较 字符串.ComparTo(目标字符串) "a".ComparTo("b"); 2.查找子串 字符串.IndexOf(子串,查找其实位置) ; 字符串.LastIndexOf(子串) ;最后一次出现的位置 str.IndexOf("ab",0); 3.插入子串 字符串.Insert(..

Parallel.ForEach和Foreach.For用法

.Net4.0中提供了新的命名空间:System.Threading.Tasks,用于提供并行计算的相关类,这里我主要介绍一个简单的类:Parallel,用于提供对并行循环和区域的支持。 简单来说,Parallel可以把一个普通的for或者foreac..

.NET Core SkiaSharp替代System.Drawing的用法

在.NET 6中,微软官方建议把 System.Drawing.Common迁移到SkiaSharp库。因为System.Drawing.Common被设计为Window 技术的精简包装器,因此其跨平台实现欠佳。SkiaSharp是一个基于谷歌的Skia图形库(Skia.org)的用于..

.NET Core分部视图PartialView用法

什么时候用用分部视图?分部视图PartialView是执行下列操作的有效方式:将大型标记文件分解为更小的组件。在由多个逻辑部分组成的大型复杂标记文件中,在分部视图中处理隔开的每个部分是有利的。 标记文件中的代码是..

.NET Core 视图组件Component用法

视图组件Component视图组件与分部视图类似,但它们的功能更加强大。 视图组件不使用模型绑定,并且仅依赖调用时提供的数据。 本文是使用控制器和视图编写的,但视图组件也与 Razor Pages 一起编写。什么是视图组件?..

.NET Core中使用System.Drawing处理图像

将.NET Framework的代码迁移到.NET Core的时候发现System.Drawing命名空间下的代码编译会报错。从官网查看到需要安装System.Drawing.Common包,我安装的时候最新版本是6.0.0。安装完成后原来的代码可以正常编译了。..

System.InvalidOperationException:“Unable to configure HTTPS endpoint.异常处理

.NET Core网站按F5运行时,在Program.cs里运行到app.Run()的时候报错:System.InvalidOperationException:“Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer ..

jwt是什么?.NET Core API如何使用JwtBearer验证

JWT是JSON Web Token的缩写,是一种开放标准(RFC 7519),用于在网络上以安全和可靠的方式传输信息。它是一种被广泛使用的跨域身份验证解决方案,可以将用户信息、访问权限等加密后存储在Token中,然后通过网络传输..

.NET Core常用缓存中间件和他们的用法

Memory Cache 中间件:它是一个简单的缓存中间件,将数据存储在内存中。在.NET Core中使用内存缓存可以很方便地缓存数据,并且不需要外部依赖。使用方法如下:// 注册缓存服务services.AddMemoryCache();// 使用缓存..

使用C#为图片去除水印

在C#中,你可以使用图像处理库来为图片去除水印。以下是一个基本的示例代码,使用AForge.NET图像处理库来去除图片中的水印:首先,确保你已经安装了AForge.NET库。你可以在Visual Studio的NuGet包管理器中搜索并安装..

AForge.NET库和它的使用方法

AForge.NET是一个功能强大的开源图像和计算机视觉框架,用于在C#和.NET平台上进行图像处理、计算机视觉和机器学习任务。它提供了广泛的图像处理和计算机视觉算法,使开发人员能够处理图像、视频和摄像头数据,并进行..

.NET Core记录请求处理时间的中间件

以下是一个示例的 .NET Core 中间件,用于记录请求处理时间的情况:using Microsoft.AspNetCore.Http;using Microsoft.Extensions.Logging;using System;using System.Diagnostics;using System.Threading.Tasks;pub..

发表回复

返回顶部