Polly是.NET中用于处理瞬态故障的弹性库,支持重试、断路器、超时、降级等策略,并可组合使用。1. 重试策略支持固定间隔和指数退避;2. 断路器在连续失败后熔断,防止雪崩;3. 超时策略限制操作耗时;4. 降级策略提供默认响应;5. 可通过PolicyWrap组合策略,推荐与IHttpClientFactory集成实现高可用通信,适用于微服务容错设计。

在现代分布式系统中,网络请求、数据库连接或外部API调用常常会遇到瞬态故障——比如超时、连接中断或限流。这些错误通常是短暂的,稍后重试即可成功。Polly 是一个强大的 .NET 库,用于定义和应用弹性策略来处理这类问题,让应用程序更健壮、更可靠。
什么是 Polly?
Polly 是一个开源的 .NET 弹性和瞬态故障处理库,允许开发者以声明式方式定义重试、断路器、超时、降级、缓存等策略。它支持同步和异步操作,并能与 HttpClient 集成(通过 Microsoft.Extensions.Http.Polly),非常适合微服务架构中的容错设计。
安装 Polly
在项目中使用 Polly 前,需通过 NuGet 安装相关包:
Polly – 核心库Microsoft.Extensions.Http.Polly – 与 IHttpClientFactory 集成
执行以下命令安装:
dotnet add package Polly dotnet add package Microsoft.Extensions.Http.Polly
常见弹性策略及其用法
1. 重试策略(Retry)
当操作因临时问题失败时,自动重试是最常见的应对方式。Polly 提供多种重试模式:
固定间隔重试:每次重试之间等待固定时间。
var retryPolicy = Policy .Handle() .Or() .RetryAsync(3, (exception, retryCount) => { Console.WriteLine($”第 {retryCount} 次重试,原因:{exception.Message}”); });
指数退避重试:避免雪崩效应,推荐用于生产环境。
var exponentialBackoffPolicy = Policy .Handle() .WaitAndRetryAsync( retryCount: 3, sleepDurationProvider: retry => TimeSpan.FromSeconds(Math.Pow(2, retry)), onRetry: (outcome, timespan, retryCount, context) => { Console.WriteLine($”等待 {timespan.TotalSeconds} 秒后进行第 {retryCount} 次重试”); } );
2. 断路器策略(Circuit Breaker)
防止系统在持续失败时不断尝试无效操作,保护下游服务。
var circuitBreakerPolicy = Policy
.Handle()
.CircuitBreakerAsync(handledEventsAllowedBeforeBreaking: 3, // 连续失败3次触发断路durationOfBreak: TimeSpan.FromSeconds(10), // 断路持续10秒onBreak: (ex, breakDelay) => Console.WriteLine($”断路器打开,暂停10秒”),onReset: () => Console.WriteLine(“断路器已关闭,恢复正常”));
断路器状态包括:Closed(正常)、Open(断开)、Half-Open(试探恢复)。
3. 超时策略(Timeout)
为操作设置最大执行时间,避免长时间挂起。
var timeoutPolicy = Policy
.TimeoutAsync(TimeSpan.FromSeconds(5), TimeoutStrategy.Pessimistic);
Pessimistic 表示需要配合 CancellationToken 使用;Optimistic 适用于支持取消的任务。
4. 降级策略(Fallback)
当所有重试失败后,提供默认值或备用逻辑,保证系统可用性。
var fallbackPolicy = Policy
.Handle()
.FallbackAsync(fallbackValue: “默认数据”,onFallbackAsync: async context => {await Log.ErrorAsync(“请求失败,启用降级方案”);});
组合策略(PolicyWrap)
实际应用中通常需要多个策略协同工作。Polly 支持将策略组合成“策略包裹”(PolicyWrap)。
var wrappedPolicy = Policy.WrapAsync(fallbackPolicy,circuitBreakerPolicy,retryPolicy,timeoutPolicy);
执行顺序:最外层先执行,因此上面例子中 fallback 最外层,能捕获内部所有策略的最终失败。
与 HttpClient 集成
在 ASP.NET Core 中,推荐结合 IHttpClientFactory 使用 Polly。
在 Program.cs 中配置:
builder.Services.AddHttpClient(“resilient-client”) .AddTransientHttpErrorPolicy(policy => policy .WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10) }));
然后通过依赖注入使用:
public class MyService { private readonly IHttpClientFactory _httpClientFactory;
public MyService(IHttpClientFactory httpClientFactory) => _httpClientFactory = httpClientFactory;public async Task GetDataAsync() { var client = _httpClientFactory.CreateClient("resilient-client"); return await client.GetStringAsync("https://api.example.com/data");}
}
最佳实践建议
根据业务场景选择合适的重试次数和退避策略,避免对服务造成压力。生产环境优先使用指数退避 + 断路器。对幂等操作使用重试,非幂等操作谨慎处理。合理使用降级策略提升用户体验。记录策略触发日志,便于监控和调试。
基本上就这些。Polly 让你在 .NET 中轻松实现专业的容错机制,无需重复造轮子。只要理解策略类型和组合逻辑,就能写出稳定又优雅的代码。
以上就是Polly库使用指南:在.NET中实现优雅的弹性与瞬态故障处理的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442424.html
微信扫一扫
支付宝扫一扫