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
# Latency Check
- "traefik.http.middlewares.latency-check.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

闭合时,断路器仅收集指标以分析请求的行为.

在指定的时间间隔( 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秒. 无法配置此值.