我有两个服务A和B,以这种方式向第三个服务C发起请求:A->C和B->C
C使用Istio配置,该Istio具有配置了断路器模式(异常检测)的目的地规则。当C以一系列连续的5xx错误响应时,断路器断开,从这时开始,接收到一个503服务不可用。
在对C的调用中,我使用一个查询参数来指示是否要模拟错误500。
我以为一旦电路打开,它对所有的呼叫都打开了,不管是从哪里开始的,但是当B用标志来模拟错误500呼叫C时,它开始接收一个503,而a一直接收一个200 OK!!!如果我现在配置A调用带有标志的C,以模拟错误500,那么它开始接收A 503。看来,打开电路要看谁打的电话,这是意料之中的行为吗?
是的。
看看我在Stack上的另一个答案,它有相关的信息。我查了断路器跳闸的记录。
在日志条目中,您可以检查它们,以找出被断路器停止的连接的两端。连接双方的IP地址都存在于istio-proxy
容器的html" target="_blank">日志消息中。
消息来自istio-proxy
容器,该容器运行受请求发送到的Circuitbreaker
策略影响的特使。此外,还有中断的连接的源和目的的IP地址。
根据本条,istio断路器有三种状态:
断路器可以有三种状态:闭合
、开路
和半开路
,并且默认情况下存在于闭合
状态。在closed
状态下,请求成功或失败,直到失败次数达到预定阈值,而断路器没有干扰。当达到阈值时,断路器断开。当调用处于open
状态的服务时,断路器会跳转请求,这意味着它返回一个错误,而不尝试执行调用。这样,通过在客户端向下游跳闸请求,可以在生产系统中防止级联故障。在可配置超时之后,断路器进入半开
状态,在该状态下,故障服务有时间从其断开的行为中恢复。如果请求在此状态下继续失败,那么断路器再次断开,并保持跳闸请求。否则,如果请求在半开
状态下成功,则断路器将关闭,并允许服务再次处理请求。
考虑到这一点,测试断路器可能会很困难,因为当处于半开
状态时,您可能会意外地使断路器跳闸,并且取决于每次服务无法恢复时都会增加的弹出时间。
我建议阅读我提到的整篇文章,因为它有最详细的解释断路器,我可以在网上找到。
我将设置一个特使代理,但仍然对断路器感到困惑。例如:(uint32值)是特使将与上游集群建立的最大连接数。如果未指定,则默认值为1024。 这是否意味着它将限制集群中每个主机的,或限制每个集群的? 提前谢谢你。
回退方法和实际方法应该返回相同的返回类型。 我应该怎么做才能从回退方法返回字符串,并从实际方法返回一些对象?
我可以看到,我可以使用以下代码以编程方式将状态设置为强制打开:CircuitBreaker强制打开状态 但是有没有一种方法可以设置一个属性,在应用程序启动时立即将状态设置为此,以便可以与测试一起使用呢?
注:本节未经校验,如有问题欢迎提issue 为什么使用它们? 线路断路器用于提供稳定性并防止在分布式系统中的级联故障。它们应该结合在远程系统之间的接口使用明智的超时,以防止单个组件的故障拖垮所有组件。 作为一个例子,我们有一个web 应用程序与远程的第三方web服务进行交互。假如第三方已用完了他们的容量,他们的数据库也在高荷载作用下熔化。假设数据库在这种情况下失败,第三方 web 服务用了很长的时
在一个节点失败的情况下,断路器可以避免这个错误影响其他服务,以免出现雪崩的情况。查看断路器的详细介绍: Pattern: Circuit Breaker. 客户端通过断路器调用服务, 一旦连续的错误达到一个阈值,断路器就会断开进行保护,这个时候如果还调用这个节点的话,直接就返回错误。等一定的时间,断路器会处于半开的状态,允许一定数量的请求尝试发送这个节点,如果正常访问,断路器就处于全开的状态,否则
我正在尝试春云和春靴。它使用了Netflix的OSS应用程序,其中有Ribbon和Hystrix。 Ribbon是一个负载均衡器,带有一些功能,其中一个是断路器。