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

2022-09-02 09:33:34

我刚刚阅读了Hystrix指南,并试图围绕默认断路器和恢复期的运行方式,以及如何自定义其行为。

显然,如果电路跳闸,Hystrix会自动调用命令的方法;我明白这一点。但是,首先使电路跳闸的标准是什么呢?理想情况下,我想尝试多次命中后备服务(例如,最多3次尝试),然后再将服务视为脱机/不正常并跳闸断路器。我如何实现这个,在哪里实现?getFallBack()

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

  • 客户端和服务器之间存在网络中断
  • 部署服务时存在一个错误,使其无法向客户端返回有效响应
  • 客户端部署时存在一个错误,使其无法向服务器发送有效请求
  • 一些奇怪的,短暂的服务打嗝(也许服务正在做一个主要的垃圾收集等)
  • 等。

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

所以我想我的下一个问题是“如何自定义默认恢复期策略?”,但我想主要是:“当服务关闭并需要手动干预时,我如何使用Hystrix通知DevOps?"


答案 1

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

如果返回代码或从服务收到的异常表明重试有意义,则可能需要在 run() 方法中执行重试。

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

正如如何通知DevOps:您应该将监控系统连接到Hystrix,以轮询断路器的状态以及成功和不成功呼叫的比率。您可以使用发布者提供的指标 JMX,也可以使用 Hystrix 的 API 编写自己的适配器。我在我准备的教程中为黎曼和Zabbix编写了两个适配器;您将为此添加很少的代码行。

本教程还提供了一个示例应用程序和一个加载驱动程序,用于尝试某些方案。

Br, 亚历山大.


答案 2

推荐