Envoy代理中的断路器模式

问题描述

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

C使用Istio进行配置,该Istio的目标规则已配置了断路器模式(异常检测)。当C连续出现一系列5xx错误做出响应时,断路器将断开,并且从这一刻起,将收到503服务不可用的消息。

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

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

解决方法

是的

看看我的其他answer在Stack上有相关信息。我在日志中检查了断路器跳闸的位置。

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

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

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

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

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

我建议您阅读我提到的整个article,因为它包含了我可以在互联网上找到的最详细的断路器说明。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...