CircuitBreaker

不要浪费时间打电话给不健康的服务

CircuitBreaker

断路器可保护您的系统免于将请求堆叠到不正常的服务(导致级联故障)的麻烦.

系统运行状况良好时,电路处于闭合状态(正常运行). 当系统运行不正常时,电路将断开,并且不再转发请求(而是由后备机制处理).

为了评估您的系统是否健康,断路器不断监视服务.

  • CircuitBreaker仅分析将其放置在中间件链中之后发生的情况. 之前发生的事情对其状态没有影响.
  • CircuitBreaker仅影响使用它的路由器. 不使用CircuitBreaker的路由器将不受其状态的影响.

Important

每个路由器最终都将获得其自己的给定断路器的实例.

如果两个不同的路由器引用相同的断路器定义,则它们每个将获得一个实例. 这意味着一个断路器可以断开,而另一个断路器保持闭合:它们的状态不共享.

这是预期的行为,我们希望您能够定义使服务正常运行的原因,而不必为每个路由声明断路器.

Configuration Examples

# Latency Check
labels:
  - "traefik.http.middlewares.latency-check.circuitbreaker.expression=LatencyAtQuantileMS(50.0) > 100"
# Latency Check
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: latency-check
spec:
  circuitBreaker:
    expression: LatencyAtQuantileMS(50.0) > 100
"labels": {
  "traefik.http.middlewares.latency-check.circuitbreaker.expression": "LatencyAtQuantileMS(50.0) > 100"
}
# Latency Check
labels:
  - "traefik.http.middlewares.latency-check.circuitbreaker.expression=LatencyAtQuantileMS(50.0) > 100"
# Latency Check
[http.middlewares]
  [http.middlewares.latency-check.circuitBreaker]
    expression = "LatencyAtQuantileMS(50.0) > 100"
# Latency Check
http:
  middlewares:
    latency-check:
      circuitBreaker:
        expression: "LatencyAtQuantileMS(50.0) > 100"

Possible States

断路器有三种可能的状态:

  • 关闭(您的服务正常运行)
  • 开放(后备机制接管您的服务)
  • 正在恢复(断路器通过逐步向您的服务发送请求来尝试恢复正常操作)

Close

While close, the circuit breaker only collects metrics to analyze the behavior of the requests.

在指定的时间间隔( checkPeriod ),它将评估expression以确定其状态是否必须更改.

Open

打开后,回退机制将在FallbackDuration期间接管正常的服务调用. 在此持续时间之后,它将进入恢复状态.

Recovering

在恢复时,断路器将逐步将请求再次发送到您的服务(以线性方式,对于RecoveryDuration ). 如果您的服务在恢复期间失败,则断路器将再次打开. 如果服务在整个恢复期间正常运行,则断路器将返回关闭状态.

Configuration Options

Configuring the Trigger

您可以指定一个expression ,一旦匹配,该expression将触发断路器(并应用后备机制而不是调用您的服务).

expression可以检查三个不同的指标:

  • 网络错误率( NetworkErrorRatio
  • 状态码比例( ResponseCodeRatio
  • 分位数时的延迟,以毫秒为单位( LatencyAtQuantileMS

NetworkErrorRatio

如果您希望断路器以30%的网络错误率触发,则表达式将为NetworkErrorRatio() > 0.30

ResponseCodeRatio

您可以根据给定范围的状态码的比率来触发断路器.

ResponseCodeRatio接受四个参数, fromtodividedByFromdividedByTo .

将要计算的运算是sum( to -> from )/ sum( dividedByFrom > dividedByTo ).

如果sum( dividedByFrom > dividedByTo )等于0,则ResponseCodeRatio返回0.

from包容性to包容性.

例如,如果25%的请求返回5XX状态(在请求中返回状态代码从0到5XX),则表达式ResponseCodeRatio(500, 600, 0, 600) > 0.25将触发断路器.

LatencyAtQuantileMS

当给定比例的请求变得太慢时,您可以触发断路器.

例如, LatencyAtQuantileMS(50.0) > 100值等待时间(分位数50)达到100MS时,表达式LatencyAtQuantileMS(50.0) > 100将触发断路器.

您必须提供分位数的浮点数(后跟.0)

Using multiple metrics

您可以在表达式中使用运算符来组合多个指标.

支持的运算符为:

  • AND( &&
  • 或( ||

例如, ResponseCodeRatio(500, 600, 0, 600) > 0.30 || NetworkErrorRatio() > 0.10 当30%的请求返回5XX状态代码或网络错误率达到10%时, ResponseCodeRatio(500, 600, 0, 600) > 0.30 || NetworkErrorRatio() > 0.10将触发断路器.

Operators

以下是受支持的运算符的列表:

  • 大于( >
  • 大于或等于( >=
  • 小于( <
  • 小于或等于( <=
  • 等于( ==
  • 不等于( !=

Fallback mechanism

后备机制向客户端返回HTTP 503 Service Unavailable (而不是调用目标服务). 无法配置此行为.

CheckPeriod

用于评估expression并确定断路器状态是否必须更改的时间间隔. 默认情况下, CheckPeriod为100ms. 无法配置此值.

FallbackDuration

默认情况下, FallbackDuration为10秒. 无法配置此值.

RecoveringDuration

恢复模式的持续时间(恢复状态).

默认情况下, RecoveringDuration为10秒. 无法配置此值.