Polly 组件总结笔记

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.MemoryMicrosoft.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 微服务架构中服务治理的关键工具。其核心价值在于:

  1. 提升系统稳定性:通过熔断、限流防止故障扩散。
  2. 优化用户体验:通过重试、缓存降低失败概率。
  3. 灵活适配场景:组合策略可应对多样化的业务需求。
    建议:结合实际业务权衡策略选择,避免过度设计。参考 Polly 官方文档 深入实践。

https://blog.51cto.com/u_15127691/4335663

上一篇
下一篇