我有两个服务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。看来打开电路取决于谁进行了调用,这是预期的行为吗?
答案 0 :(得分:0)
是的
看看我的其他answer在Stack上有相关信息。我在日志中检查了断路器跳闸的位置。
在日志条目中,您可以检查它们以找出断路器停止的连接的两端。
istio-proxy
容器的日志消息中显示了连接双方的IP地址。
该消息来自运行Envoy的
istio-proxy
容器,该容器受请求发送到的CircuitBreaker
策略的影响。还有被中断的连接的源和目标的IP地址。
据此article istio断路器具有三种状态:
断路器可以具有三种状态:
closed
,open
和half open
,并且默认情况下以closed
状态存在。在closed
状态下,请求成功或失败,直到失败次数达到预定阈值为止,而不受断路器的干扰。达到阈值时,断路器断开。当在open
状态下调用服务时,断路器会跳出请求,这意味着它会返回错误,而不会尝试执行该调用。这样,通过在客户端向下游释放请求,可以防止生产系统中的级联故障。在可配置的超时后,断路器进入half open
状态,在该状态下,故障服务将有时间从其故障行为中恢复。如果在此状态下请求继续失败,则断路器将再次断开并保持跳闸请求。否则,如果请求在half open
状态成功,则断路器将闭合,并且服务将被允许再次处理请求。
考虑这一点可能很困难,因为在half open
状态下,断路器可能会意外跳闸,并且取决于弹出时间,每次服务无法恢复,弹出时间都会增加。
我建议您阅读我提到的整个article,因为它包含了我可以在互联网上找到的最详细的断路器说明。