LOADING

加载过慢请开启缓存 浏览器默认开启

熔断降级

2025/2/19 算法

熔断降级是一种在系统出现故障或异常情况时,为了避免故障蔓延,对系统进行保护的机制。通常当某个服务或操作频繁失败时,会触发熔断,后续的请求会直接走降级逻辑,而不是继续尝试可能失败的操作。

熔断降级的基本概念

  • 熔断:当系统检测到某个服务或操作的错误率超过一定阈值,或者在一定时间内出现过多的错误时,会触发熔断。熔断后,对该服务或操作的请求会直接被拦截,不再尝试调用实际的逻辑。

  • 降级:在熔断触发后,会执行一个预先定义好的降级逻辑,返回一个默认值或者执行一些简单的处理,以避免长时间等待或者系统崩溃。

  • 恢复:在熔断一段时间后(通常称为休眠窗口),系统会尝试恢复正常,重新允许部分请求调用实际的逻辑,根据调用结果来判断是否继续熔断。

实现熔断降级

选择熔断降级库

在 Go 语言中,有一些常用的熔断降级库,比如 hystrix-gogo-kit/circuitbreaker 等,我用 hystrix-go

配置熔断参数

在使用 hystrix-go 时,需要配置一些熔断的参数,这些参数决定了熔断的触发条件和恢复机制。例如:

package main

import (
    "github.com/afex/hystrix-go/hystrix"
)

func init() {
    // 配置熔断命令
    hystrix.ConfigureCommand("myCommand", hystrix.CommandConfig{
        Timeout:               1000, // 超时时间,单位毫秒
        MaxConcurrentRequests: 100,  // 最大并发请求数
        ErrorPercentThreshold: 25,   // 错误率阈值,超过该阈值会触发熔断
        SleepWindow:           5000, // 熔断后的休眠窗口时间,单位毫秒
    })
}
  • Timeout:表示请求的超时时间,如果一个请求的处理时间超过这个时间,就会被认为是超时,会触发熔断。
  • MaxConcurrentRequests:表示最大并发请求数,当并发请求数超过这个值时,新的请求可能会被拒绝。
  • ErrorPercentThreshold:表示错误率阈值,当错误率超过这个值时,会触发熔断。
  • SleepWindow:表示熔断后的休眠窗口时间,在熔断触发后,会进入休眠窗口,在这个时间段内,所有请求都会直接走熔断降级逻辑,休眠窗口结束后,会尝试恢复正常。

编写正常逻辑和降级逻辑

在使用 hystrix-go 时,需要编写正常逻辑和降级逻辑。正常逻辑是在系统正常情况下执行的逻辑,降级逻辑是在熔断触发后执行的逻辑。

package main

import (
    "fmt"
    "github.com/afex/hystrix-go/hystrix"
)

func main() {
    err := hystrix.Do("myCommand", func() error {
        // 正常逻辑
        fmt.Println("执行正常逻辑")
        // 模拟错误
        return fmt.Errorf("发生错误")
    }, func(err error) error {
        // 降级逻辑
        fmt.Println("执行降级逻辑")
        return nil
    })

    if err != nil {
        fmt.Println("操作失败:", err)
    }
}

hystrix.Do 函数接受三个参数:

  • 第一个参数是熔断命令的名称,需要和配置时的名称一致。
  • 第二个参数是一个匿名函数,用于执行正常逻辑。
  • 第三个参数是一个匿名函数,用于执行降级逻辑。当正常逻辑出现错误(包括超时、错误率超过阈值等情况)时,会执行这个降级函数。