Polly .NET de código abierto descripción del proyecto

Hoy introdujo una biblioteca de código abierto .NET: Polly, es compatible con .NET Core, el número actual de la estrella en GitHub ha excedido 7000, es una biblioteca de gran alcance y útil .NET.

Polly Introducción

La introducción oficial de Polly es la siguiente:

Polly es una resiliencia .NET y biblioteca transitoria de falla de manipulación que permite a los desarrolladores expresan políticas como Reintentar, interruptor de circuito, de tiempo de espera, pasante de aislamiento, y de retorno de una manera fluida y thread-safe.

O menos traducido significa: Polly NET es una biblioteca resiliente y transitoria de fallo de procesamiento que permite a los desarrolladores y Fluido manera segura para los subprocesos para lograr un reintento, desconexión, el tiempo de espera, el aislamiento y las estrategias de reversión.

Esta descripción es un poco abstracto, trabajamos juntos para entenderlo.

En primer lugar, que contiene defecto transitorio aquí se produce una excepción y los resultados del programa no cumple con las expectativas de los desarrolladores parecen. La llamada falla transitoria, que la culpa no está obligado a pasar, pero en ocasiones puede ocurrir, tales como la red de vez en cuando de repente inestable o no pueden acceder a este fracaso. En cuanto a la flexibilidad, se refiere a las estrategias de tratamiento para tratar el fracaso de la diversidad Polly y la flexibilidad de sus diversos flexibilidad de las políticas para definir y combinaciones.

Vamos a mostrar un ejemplo, tenemos aún más claras.

Ejemplo de Política Solución de problemas

Una convención, crear un proyecto de consola vacía, y la instalación de paquetes NuGet:

Install-Package Polly

política de uso básica Polly manejo de excepciones se puede dividir en tres pasos, que comprende la etapa descrita en el siguiente código:

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);
}

Se puede ver en el ejemplo, es compatible la API de Polly transmisión de llamadas (Fluido), fácil de usar. Este ejemplo muy simple de la política de control de errores, cuando se produce un error de red o solicitud de excepción, se reintenta tres veces. Figura podemos ver que durante la ejecución de esta estrategia de operar resultados de los siguientes:

En concreto, la siguiente solución de problemas de soporte Polly de diversas estrategias.

Polly Siete estrategias

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 文档。

参考:

 

http://www.thepollyproject.org

https://github.com/App-vNext/Polly

https://github.com/App-vNext/Polly/wiki

 

原文链接:https://www.cnblogs.com/willick/p/polly.html

 

Supongo que te gusta

Origin www.cnblogs.com/88223100/p/polly.html
Recomendado
Clasificación