熔断与降级
外观
概述[编辑 | 编辑源代码]
熔断(Circuit Breaking)与降级(Degradation)是分布式系统中保障服务稳定性的核心策略,通过牺牲部分非核心功能或请求,防止系统因过载或依赖服务故障而完全崩溃。两者的核心差异在于:
- 熔断:当错误率超过阈值时,主动切断对故障服务的调用,进入"快速失败"模式
- 降级:在系统压力过大时,暂时关闭非关键功能或返回简化结果
工作原理[编辑 | 编辑源代码]
熔断机制[编辑 | 编辑源代码]
熔断器通常有三种状态,可通过状态模式实现:
数学表达式描述熔断触发条件:
降级策略[编辑 | 编辑源代码]
常见降级方式包括:
- 功能降级:关闭非核心功能(如商品详情页隐藏推荐模块)
- 数据降级:返回缓存数据或简化数据模型
- 延迟降级:将实时请求转为异步处理
实现示例[编辑 | 编辑源代码]
Spring Cloud Hystrix 示例[编辑 | 编辑源代码]
// 熔断配置
@HystrixCommand(
fallbackMethod = "getDefaultResponse",
commandProperties = {
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="10"),
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="5000")
}
)
public String callExternalService() {
// 调用可能失败的外部服务
return restTemplate.getForObject("http://external/api", String.class);
}
// 降级方法
public String getDefaultResponse() {
return "Service Temporarily Unavailable";
}
输入/输出示例: 模板:TableStart | 场景 | 正常响应 | 熔断后响应 | 外部服务正常 | "Actual response data" | - | 外部服务宕机 | 抛出异常 | "Service Temporarily Unavailable" 模板:TableEnd
Go 语言实现[编辑 | 编辑源代码]
type CircuitBreaker struct {
failures int
threshold int
resetTimeout time.Duration
state string // "closed", "open", "half-open"
}
func (cb *CircuitBreaker) AllowRequest() bool {
switch cb.state {
case "open":
return false
case "half-open":
return time.Now().After(cb.lastFailure.Add(cb.resetTimeout))
default:
return true
}
}
实际应用案例[编辑 | 编辑源代码]
电商系统案例[编辑 | 编辑源代码]
场景:支付服务依赖第三方支付网关
处理流程: 1. 当连续3次调用支付网关超时(熔断条件) 2. 系统自动切换至「账户余额支付」降级方案 3. 每30秒尝试恢复连接(半开状态) 4. 成功1次后完全恢复
效果对比: 模板:TableStart | 策略 | 成功率 | 平均响应时间 | 无熔断 | 62% | 3200ms | 启用熔断 | 98% | 210ms 模板:TableEnd
配置建议[编辑 | 编辑源代码]
参数 | 建议值 | 说明 |
---|---|---|
滑动窗口大小 | 20-100请求 | 统计错误率的样本量 |
错误率阈值 | 50-70% | 触发熔断的临界值 |
冷却时间 | 5-30秒 | Open→HalfOpen的等待时间 |
常见误区[编辑 | 编辑源代码]
- 过度熔断:阈值设置过严导致正常请求被阻断
- 降级无预案:未提前设计降级方案导致系统雪崩
- 忽略监控:未对熔断事件进行告警和日志记录
进阶话题[编辑 | 编辑源代码]