Hystrix:自定义断路器和恢复逻辑

Posted

技术标签:

【中文标题】Hystrix:自定义断路器和恢复逻辑【英文标题】:Hystrix: Custom circuit breaker and recovery logic 【发布时间】:2015-01-19 20:59:36 【问题描述】:

我刚刚阅读了Hystrix 指南,并试图了解默认断路器和恢复期如何运作,以及如何自定义它们的行为。

显然,如果电路跳闸,Hystrix 会自动调用命令的getFallBack() 方法;这我明白了。但是首先使电路跳闸的标准是什么?理想情况下,在我们认为服务脱机/不健康并触发断路器之前,我想尝试多次访问支持服务(例如,最多 3 次尝试)。 我该如何实施?在哪里实施?

但我想如果我覆盖默认断路器,我还必须覆盖处理默认恢复期的任何机制。如果支持服务出现故障,可能是由于以下几种原因之一:

客户端和服务器之间出现网络中断 服务部署时存在一个错误,导致无法向客户端返回有效响应 客户端部署了一个错误,导致它无法向服务器发送有效请求 一些奇怪的、短暂的服务中断(可能服务正在执行主要的垃圾收集等) 等

在大多数情况下,仅仅等待 N 秒然后重试的恢复期是不够的。如果服务中存在错误,或者有人在数据中心拔了一些网络电缆,我们将总是从该服务中遇到故障。只有在少数情况下,客户端服务会在没有任何人工交互的情况下自动修复自己。

所以我猜我的下一个问题部分是“如何自定义默认恢复期策略?”,但我猜主要是:“如何使用 Hystrix 通知 devops服务何时关闭并需要人工干预?

【问题讨论】:

【参考方案1】:

基本上Hystrix调用fallback方法的原因有四个:异常、超时、并行请求太多、或者之前调用的异常太多。

如果您从服务收到的返回码或异常表明重试有意义,您可能希望在 run() 方法中进行重试。

在命令的后备方法中,您可能会在超时时重试 - 当并行请求过多或异常过多时,再次调用相同的服务通常没有意义。

还问如何通知 devops:您应该将监控系统连接到 Hystrix,以轮询断路器的状态以及成功和不成功调用的比率。您可以使用 metrics publishers 提供的 JMX,或使用 Hystrix 的 API 编写自己的适配器。我在tutorial I prepared 中为 Riemann 和 Zabbix 编写了两个适配器;您将为此编写非常少的代码。

本教程还有一个示例应用程序和一个负载驱动程序来尝试一些场景。

兄弟, 亚历山大。

【讨论】:

优秀答案@ahus1 (+1) - 只是好奇:如果目标服务再次变得健康,有没有办法控制断路器的重新闭合?换句话说,假设服务中断了几分钟:希望断路器跳闸并打开。现在,对服务的所有调用都将导致getFalllback 执行。但现在服务又恢复了健康。 Hystrix如何知道关闭断路器并允许run再次执行? @IAmYourFaja:当出现大量错误时(默认情况下:一个时间范围内超过 50% 的错误),断路器将触发。之后,所有请求都将由回退处理(如果有的话)。几秒钟后(默认值:5 秒),单个请求首先被转发到原始服务。如果成功,则再次关闭所有电路,并再次将请求转发到原始服务。有关配置值,请参阅 github.com/Netflix/Hystrix/wiki/Configuration。有关功能,请参阅 github.com/Netflix/Hystrix/wiki/How-it-Works#CircuitBreaker。 默认情况下,恢复检查不是每 5 秒发生一次。每次调用原始服务并且在 FAILURE 时调用回退。有没有人遇到过这个问题?

以上是关于Hystrix:自定义断路器和恢复逻辑的主要内容,如果未能解决你的问题,请参考以下文章

如何在断路器中添加重试和自定义恢复方法 - 功能性 java

断路器Hystrix与Turbine集群监控-Spring Cloud学习第三天

在 Hystrix 中触发回退的自定义错误条件

了解自定义指标发布者如何在 hystrix 上工作

Feign-灵活的使用Hystrix熔断(自定义CommandKey)

hystrix熔断器之自定义插架