熔断(Circuit Breaker)的业务逻辑要点

熔断器模式是一种用于提高系统稳定性和容错能力的设计模式,主要用于防止因依赖服务故障导致的级联失败。其核心思想是:当某个依赖服务出现故障时,快速失败并停止调用,避免资源耗尽,同时在一段时间后尝试恢复。

熔断器的核心逻辑要点:

  1. 状态管理

    • Closed(关闭状态):正常调用依赖服务。
    • Open(打开状态):停止调用依赖服务,直接返回失败或降级结果。
    • Half-Open(半开状态):尝试恢复调用,根据结果决定是否切换到关闭状态。
  2. 失败检测

    • 当调用依赖服务失败次数达到阈值时,熔断器从关闭状态切换到打开状态。
  3. 超时机制

    • 在打开状态下,熔断器会等待一段时间(恢复时间)后进入半开状态。
  4. 恢复机制

    • 在半开状态下,允许部分请求通过。如果成功,则切换到关闭状态;如果失败,则重新进入打开状态。
  5. 降级策略

    • 在打开状态下,返回默认值或执行降级逻辑,避免影响用户体验。

.NET Core 下的熔断器实现

在 .NET Core 中,可以使用 Polly 库来实现熔断器模式。Polly 是一个强大的弹性与瞬态故障处理库,支持重试、熔断、超时等多种策略。

实现步骤:

  1. 安装 Polly 库

    dotnet add package Polly
  2. 定义熔断策略

    • 设置失败阈值、熔断持续时间等参数。
  3. 应用熔断策略

    • 在调用外部服务时,使用熔断策略包装调用逻辑。

示例代码:

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Polly;
using Polly.CircuitBreaker;

class Program
{
    static async Task Main(string[] args)
    {
        // 定义熔断策略:失败3次后熔断,持续5秒
        var circuitBreakerPolicy = Policy
            .Handle<HttpRequestException>() // 捕获的异常类型
            .CircuitBreakerAsync(
                exceptionsAllowedBeforeBreaking: 3, // 失败次数阈值
                durationOfBreak: TimeSpan.FromSeconds(5) // 熔断持续时间
            );

        // 模拟调用外部服务
        var httpClient = new HttpClient();
        for (int i = 0; i < 10; i++)
        {
            try
            {
                // 使用熔断策略包装调用逻辑
                var response = await circuitBreakerPolicy.ExecuteAsync(() =>
                    httpClient.GetAsync("https://example.com/api/unreliable")
                );

                Console.WriteLine($"Request {i + 1}: Success - {response.StatusCode}");
            }
            catch (BrokenCircuitException)
            {
                Console.WriteLine($"Request {i + 1}: Circuit is OPEN (fast fail)");
            }
            catch (HttpRequestException)
            {
                Console.WriteLine($"Request {i + 1}: Failed (counts towards circuit breaker)");
            }

            await Task.Delay(1000); // 模拟间隔
        }
    }
}

代码说明:

  1. Policy.Handle\<TException>():指定需要捕获的异常类型。
  2. CircuitBreakerAsync():定义熔断策略,设置失败次数阈值和熔断持续时间。
  3. ExecuteAsync():使用熔断策略执行异步操作。
  4. BrokenCircuitException:当熔断器处于打开状态时,抛出此异常。

高级用法:结合重试和降级策略

在实际场景中,熔断器通常与重试、降级等策略结合使用。例如:

  • 重试:在熔断前尝试重试几次。
  • 降级:在熔断时返回默认值或执行备用逻辑。

示例代码:

var retryPolicy = Policy
    .Handle<HttpRequestException>()
    .RetryAsync(2); // 重试2次

var fallbackPolicy = Policy<string>
    .Handle<BrokenCircuitException>()
    .FallbackAsync("Fallback response"); // 降级响应

var combinedPolicy = Policy.WrapAsync(fallbackPolicy, circuitBreakerPolicy, retryPolicy);

var result = await combinedPolicy.ExecuteAsync(async () =>
{
    var response = await httpClient.GetAsync("https://example.com/api/unreliable");
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
});

Console.WriteLine($"Result: {result}");

总结

  • 熔断器模式:通过状态管理、失败检测和恢复机制,防止级联故障。
  • Polly 库:在 .NET Core 中实现熔断器的首选工具,支持灵活的策略组合。
  • 实际应用:结合重试、降级等策略,提升系统的稳定性和容错能力。
最后修改日期: 2025年1月6日

作者