使用Polly提高服务可用性
什么是Polly
Polly是一个.NET弹性和瞬时故障处理库,它允许开发者以流畅和线程安全的方式表达诸如重试、断路、超时、隔板隔离、速率限制和回退等策略。
Polly是.Net生态非常著名的一个组件包。
Polly针对.NET标准1.1(覆盖范围:.NET Core 1.0、Mono、Xamarin、UWP、WP8.1+)和.NET标准2.0+(覆盖范围:.NET Core 2.0+、.NET Core 3.0,以及后来的Mono、Xamarin和UWP目标)。NuGet软件包还包括.NET框架4.6.1和4.7.2的直接目标。
Polly组件包
- Polly,这是Polly的核心包
- Polly.Extensions.Http,Polly基于Http的一些扩展
- Microsoft.Extensions.Http.Polly,HttpClientFactory组件包的Polly扩展包
Polly的能力
- 失败重试,当调用失败时能够自动重试
- 服务熔断,当部分服务不可用时,应用可以快速响应一个熔断的结果,避免持续的请求这些不可用的服务而导致整个应用程序跪掉
- 超时处理,指为服务的请求设置一个超时时间,当超过超时时间时可以按照预定的操作进行处理,比如说返回一个缓存结果
- 舱壁隔离,实际上是一个限流功能,可以为服务定义最大的流量和队列,这样子避免我们的服务因为请求量过大而被压崩
- 缓存策略,让我们与类似于AOP的方式为应用嵌入缓存的机制,可以当缓存命中时可以快速地响应缓存,而不是持续地请求服务
- 失败降级,指当服务不可用时,可以响应一个更友好的结果而不是报错
- 组合策略,可以让我们将上面的策略组合在一起,按照一定的顺序,可以对不同场景组合不同的策略类,实现应用程序
Polly的使用步骤
整个Polly的使用步骤是分三步走的:
- 定义要处理的异常类型或返回值
- 定义要处理的动作(重试、熔断、降级响应等)
- 使用定义的策略来执行代码
适合失败重试的场景
适合失败重试的条件
- 服务"失败"是短暂的,可自愈的,在失败重试的场景中,可以非常有效的避免这种网络闪断的情况
- 服务是幂等的,重复调用不会有副作用,在失败重试的场景下,有可能会造成多次调用的情况,有些失败可能是命令已经发出了,但是还没收到响应,它会重试,所以需要服务是幂等的,重复调用不能有副作用,这样才可以使用失败重试
场景举例
- 网络闪断
- 部分服务节点异常
最佳实践
- 设置失败重试的次数,尽量设置重试的次数
- 设置带有步长策略的失败等待间隔,尽量设置不同的间隔,重试的间隔时间需要设置,否则它会持续不断地去重试,会造成类似于DDOS的情况
- 设置降级响应,当我们失败重试的次数达到上限以后,应该为服务提供一个降级的响应,提供更友好的响应结果
- 设置断路器,为我们的服务设置断路器,就是熔断,当我们重试一定次数可能服务还是不可用,那么我们应该设置断路器