今天介绍一个 .NET 开源库:Polly:
Polly 是.NET生态非常著名的组件包,它是支持 .NET Core 的。
目前在 GitHub 的 Star 数量已经接近 5 千,它是一个强大且实用的 .NET 库。
该项目作者现已成为.NET基金会一员,项目一直在不停迭代和更新,你值得拥有。
项目地址【https://github.com/App-vNext/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 的处理策略具有多样性和灵活性,它的各种策略可以灵活地定义和组合。
Polly 的能力
• 服务熔断:当我们服务部分不可用时,我们的应用可以快速响应一个熔断结果,避免持续的请求这些不可用的服务而导致整个应用程序出现问题
• 失败重试:当我们服务调用失败时,能够自动的重试
• 超时处理:我们为服务的请求设置一个超时时间,当超过超时时间可以按照我们预定的操作进行处理,比如返回一个缓存的结果。
• 舱壁隔离:实际上是一个限流的功能,我们可以为服务定义最大的流量和队列,这样可以避免我们的服务因为请求量过大而被压崩。
• 缓存策略:可以让我与类似于AOP 方式为应用嵌入缓存的机制,当缓存命中时,我们可以快速地响应缓存,而不是持续的请求服务。
• 失败降级:当我们的服务不可用时,我们可以响应一个更友好的结果而不是报错。
• 组合策略:可以让我们将上面的 策略组合在一起,按照一定的顺序,我们可以对不同的场景组合不同的策略类,实现我们的应用程序。
Polly 使用步骤
• 定义要处理的异常类型或返回值
• 定义要处理动作(重试、熔断、降级响应等)
• 使用定义的策略来执行代码
适合失败重试的场景
• 服务“失败”是短暂的,可自愈的
在失败的场景里,我们可以非常有效的避免这种网络闪断这种情况
• 服务是幂等的,重复调用不会有副作用
在失败重试情况下,有可能会造成多次调用的情况,因为有些失败,可能是你的命令已经发出了,但是你没收到响应,它会重试。
场景举例
• 网络闪断
• 部分服务节点异常
重试的过程可能就可以命中到正常的节点
最佳实践
• 设置失败重试次数
• 设置带有步长策略的失败等待间隔
• 设置降级响应
• 设置断路器
尽量设置重试的次数,尽量设置不同的间隔,否则会造成类似于DDOS的情况,当我们的重试的次数达到上限以后,我们应该为服务提供一个降级的响应,更友好的响应结果。(DDOS 全称Distributed Denial of Service,中文意思为“分布式拒绝服务”,就是利用大量合法的分布式服务器对目标发送请求,从而导致正常合法用户无法获得服务)
策略的类型
• 被动策略(异常处理、结果处理)
• 主动策略(超时处理、断路器、舱壁隔离、缓存)
组合策略
• 降级响应
• 失败重试
• 断路器
• 舱壁隔离