【问题标题】:Circuit breaker pattern in Envoy proxyEnvoy 代理中的断路器模式
【发布时间】:2021-01-07 17:15:29
【问题描述】:

我有两个服务 A 和 B,以这种方式向第三个服务 C 发起请求:A-->C 和 B-->C

C 配置了 Istio,其目标规则配置了断路器模式(异常值检测)。当 C 响应一系列连续的 5xx 错误时,断路器会打开,并且从这一刻起收到 503 服务不可用。

在对 C 的调用中,我使用查询参数来指示是否要模拟错误 500。

我认为一旦电路打开,无论来源如何,它都会为所有呼叫打开,但是当 B 使用标志调用 C 以模拟错误 500 时,它开始接收 503 而 A 继续接收 200 OK !!!如果我现在配置 A 调用带有标志的 C 以模拟错误 500,它开始接收 503。似乎打开电路取决于谁进行调用,这是预期的行为吗?

【问题讨论】:

  • Istio 使用 Envoy 来实现这些功能,只是为了增加一些清晰度,circuit breakingoutlier detection 在 Envoy 中是两个不同的东西。连续的 5xx 是 outlier detection 而不是 circuit breaking 的一部分。无论如何,这两者都具有何时允许通信以及何时不允许通信的配置。对于异常值检测,基础弹出时间为 30s,因此 30s 之后的任何调用都将是 200

标签: istio envoyproxy circuit-breaker


【解决方案1】:

是的。

看看我在 Stack 上的另一个 answer 有相关信息。我检查了断路器确切跳闸的日志。

在日志条目中,您可以检查它们以找出被断路器停止的连接的两端。来自istio-proxy 容器的日志消息中存在连接双方的 IP 地址。

消息来自运行 Envoy 的 istio-proxy 容器,该容器受请求发送到的 CircuitBreaker 策略的影响。还有中断连接的源和目标的 IP 地址。

据此article istio 断路器有三种状态:

断路器可以具有三种状态:closedopenhalf open,默认情况下处于 closed 状态。在closed 状态下,请求成功或失败,直到失败次数达到预定阈值,没有断路器的干扰。当达到阈值时,断路器打开。当以open 状态调用服务时,断路器跳闸请求,这意味着它返回错误而不尝试执行调用。通过这种方式,通过在客户端触发下游请求,可以防止生产系统中的级联故障。在可配置的超时之后,断路器进入half open 状态,在该状态下,失败的服务有时间从其损坏的行为中恢复。如果在此状态下请求继续失败,则断路器会再次打开并继续触发请求。否则,如果请求在half open 状态下成功,则断路器将关闭,并允许服务再次处理请求。

考虑到这一点,测试断路器可能会很困难,因为您可能会在处于half open 状态时意外跳闸,并且取决于每次服务无法恢复时都会增加的弹出时间。

我建议阅读我提到的整个article,因为它有我在互联网上可以找到的关于断路器的最详细的解释。

【讨论】:

    猜你喜欢
    • 2018-06-03
    • 2019-05-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多