跳转到内容

熔断与降级

来自代码酷

模板:Note

概述[编辑 | 编辑源代码]

熔断(Circuit Breaking)降级(Degradation)是分布式系统中保障服务稳定性的核心策略,通过牺牲部分非核心功能或请求,防止系统因过载或依赖服务故障而完全崩溃。两者的核心差异在于:

  • 熔断:当错误率超过阈值时,主动切断对故障服务的调用,进入"快速失败"模式
  • 降级:在系统压力过大时,暂时关闭非关键功能或返回简化结果

模板:TOC limit

工作原理[编辑 | 编辑源代码]

熔断机制[编辑 | 编辑源代码]

熔断器通常有三种状态,可通过状态模式实现:

stateDiagram-v2 [*] --> Closed: 初始状态 Closed --> Open: 失败次数≥阈值 Open --> HalfOpen: 经过冷却时间 HalfOpen --> Closed: 探测请求成功 HalfOpen --> Open: 探测请求失败

数学表达式描述熔断触发条件: {触发熔断当 failureCounttotalRequeststhreshold恢复服务当 healthCheck()=true

降级策略[编辑 | 编辑源代码]

常见降级方式包括:

  • 功能降级:关闭非核心功能(如商品详情页隐藏推荐模块)
  • 数据降级:返回缓存数据或简化数据模型
  • 延迟降级:将实时请求转为异步处理

实现示例[编辑 | 编辑源代码]

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的等待时间

常见误区[编辑 | 编辑源代码]

  • 过度熔断:阈值设置过严导致正常请求被阻断
  • 降级无预案:未提前设计降级方案导致系统雪崩
  • 忽略监控:未对熔断事件进行告警和日志记录

进阶话题[编辑 | 编辑源代码]

  • 熔断与限流的组合使用
  • 自适应熔断算法(如Netflix的动态权重调整
  • 分布式场景下的熔断传播机制


模板:Stub