Polly 组件总结笔记
Polly 是一个专为 .NET 开发的弹性故障处理库,主要用于服务治理中的异常处理与系统稳定性保障。其核心功能通过 六大策略 实现,分为 被动处理策略(重试、熔断、回滚)和 主动应对策略(超时、限流、缓存),并支持策略组合使用。
1. 重试策略(Retry)
-
定义:当服务调用出现瞬时故障(如网络波动、服务器短暂不可用)时,自动重新尝试请求。
-
常用方法:
WaitAndRetry
(等待后重试)。 -
示例:
var policy = Policy.Handle<Exception>().WaitAndRetry(3, retryAttempt => TimeSpan.FromSeconds(1)); policy.Execute(() => { /* 调用代码 */ });
-
效果:前两次失败时等待重试,最后一次失败后抛出异常。
-
适用场景:偶发性故障的容错(如高峰期临时请求失败)。
2. 熔断策略(Circuit Breaker)
- 定义:当服务持续失败时,主动中断调用以避免雪崩效应,一段时间后尝试恢复。
- 三种状态:
- 正常:允许所有请求。
- 熔断:直接返回异常,保护下游服务。
- 半熔断:允许少量请求试探服务可用性。
- 示例:
var policy = Policy.Handle<Exception>().AdvancedCircuitBreaker( failureThreshold: 0.8, // 80%失败率触发熔断 samplingDuration: TimeSpan.FromSeconds(2), minimumThroughput: 5, durationOfBreak: TimeSpan.FromSeconds(1) );
- 效果:达到阈值后熔断1秒,尝试半熔断恢复。
- 适用场景:防止级联故障(如依赖服务宕机)。
3. 回滚策略(Fallback)
-
定义:当调用失败时返回预设的默认值或备用逻辑,避免直接报错。
-
示例:
var policy = Policy<string>.Handle<Exception>().Fallback("默认值"); var result = policy.Execute(() => { /* 调用代码 */ });
-
效果:失败时返回
"默认值"
。 -
注意:需权衡场景,简单场景可用
try-catch
替代。
4. 超时策略(Timeout)
- 定义:限制操作的最大执行时间,避免长时间阻塞。
- 两种模式:
- 乐观超时:通过
CancellationToken
主动取消执行。 - 悲观超时:超时后抛出异常但不中断原操作。
- 乐观超时:通过
- 示例(悲观超时):
var policy = Policy.Timeout(1, TimeoutStrategy.Pessimistic); policy.Execute(() => { Thread.Sleep(2000); }); // 超时后抛出异常
- 效果:1秒后抛出
TimeoutRejectedException
,但线程仍继续执行。 - 改进方案:结合布尔变量手动中断操作。
5. 限流策略(Bulkhead)
- 定义:限制并发请求和排队数量,防止资源耗尽。
- 示例:
var policy = Policy.Bulkhead(2, 3); // 最大2个并发,队列3个 Parallel.For(0, 10, i => { policy.Execute(() => { Thread.Sleep(500); }); });
- 效果:最多允许5个线程执行,其余抛出异常。
- 适用场景:保护API接口免受高频调用冲击。
6. 缓存策略(Cache)
- 定义:缓存请求结果以减少重复调用,提升性能。
- 依赖包:需安装
Polly.Caching.Memory
和Microsoft.Extensions.Caching.Memory
。 - 示例:
var cacheProvider = new MemoryCache(new MemoryCacheOptions()); var policy = Policy.Cache(cacheProvider, TimeSpan.FromSeconds(2)); var result = policy.Execute(() => DateTime.Now.ToString()); // 2秒内返回相同值
- 效果:2秒内重复调用返回缓存结果。
- 注意:适用于读多写少的场景(如静态数据查询)。
7. 组合策略(PolicyWrap)
- 定义:将多个策略按顺序组合使用,增强系统鲁棒性。
- 示例:超时后重试
var timeout = Policy.Timeout(500, TimeoutStrategy.Optimistic); var retry = Policy.Handle<Exception>().Retry(); var combinedPolicy = Policy.Wrap(timeout, retry); // 先超时,后重试 combinedPolicy.Execute(() => { /* 调用代码 */ });
- 效果:首次超时后自动重试一次。
- 适用场景:复杂故障处理(如限流+熔断+重试组合)。
总结
Polly 提供了系统化的弹性处理机制,是 .NET 微服务架构中服务治理的关键工具。其核心价值在于:
- 提升系统稳定性:通过熔断、限流防止故障扩散。
- 优化用户体验:通过重试、缓存降低失败概率。
- 灵活适配场景:组合策略可应对多样化的业务需求。
建议:结合实际业务权衡策略选择,避免过度设计。参考 Polly 官方文档 深入实践。