熔断(Circuit Breaker)的业务逻辑要点
熔断器模式是一种用于提高系统稳定性和容错能力的设计模式,主要用于防止因依赖服务故障导致的级联失败。其核心思想是:当某个依赖服务出现故障时,快速失败并停止调用,避免资源耗尽,同时在一段时间后尝试恢复。
熔断器的核心逻辑要点:
-
状态管理:
- Closed(关闭状态):正常调用依赖服务。
- Open(打开状态):停止调用依赖服务,直接返回失败或降级结果。
- Half-Open(半开状态):尝试恢复调用,根据结果决定是否切换到关闭状态。
-
失败检测:
- 当调用依赖服务失败次数达到阈值时,熔断器从关闭状态切换到打开状态。
-
超时机制:
- 在打开状态下,熔断器会等待一段时间(恢复时间)后进入半开状态。
-
恢复机制:
- 在半开状态下,允许部分请求通过。如果成功,则切换到关闭状态;如果失败,则重新进入打开状态。
-
降级策略:
- 在打开状态下,返回默认值或执行降级逻辑,避免影响用户体验。
.NET Core 下的熔断器实现
在 .NET Core 中,可以使用 Polly 库来实现熔断器模式。Polly 是一个强大的弹性与瞬态故障处理库,支持重试、熔断、超时等多种策略。
实现步骤:
-
安装 Polly 库:
dotnet add package Polly
-
定义熔断策略:
- 设置失败阈值、熔断持续时间等参数。
-
应用熔断策略:
- 在调用外部服务时,使用熔断策略包装调用逻辑。
示例代码:
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); // 模拟间隔
}
}
}
代码说明:
- Policy.Handle\<TException>():指定需要捕获的异常类型。
- CircuitBreakerAsync():定义熔断策略,设置失败次数阈值和熔断持续时间。
- ExecuteAsync():使用熔断策略执行异步操作。
- 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 中实现熔断器的首选工具,支持灵活的策略组合。
- 实际应用:结合重试、降级等策略,提升系统的稳定性和容错能力。