与正常的异常处理相比,Hystrix 有哪些优势?

What are Hystrix benefits over normal exception handling?

我对 Hystrix 主题和弹性服务的概念真的很陌生,我正在学习一些课程,我想到了这个问题。

在 Hystrix 中,我需要为优雅降级定义回退方法,然后在电路断开时调用此方法。但我可以想象只用 trycatch 包装代码,当出现特定异常时(例如超时)调用 catch 子句中的回退方法。当调用的服务启动时,将调用正常代码。

当然,有了 Hystrix,我还可以监控它,但它还能给我带来什么?。我很确定我不理解整个概念。

我想你是说我们可以实现整个断路器逻辑?你是对的。但是为什么更好地使用已经被证明为 Hystrix 的东西呢?我会说:

  1. 断路逻辑已经防弹。
  2. 开箱即用的指标,例如 dashboard
  3. 定义一种模式来处理互连服务的级联故障。意思是,如果一项服务出现故障,您已经知道如何继续为您自己的服务提供服务请求。
  4. 它帮助开发者在编写代码时针对外部依赖改变思维方式-设计失败-,简单的让他们思考如果失败了怎么办?通常,开发人员不会这样做。你假设它会起作用。

我认为hystrix下没有神奇的定义。这是一个开发人员通常不会考虑的简单问题。

主要区别在于Hystrix在检测到错误时会打开电路(这是对电路的类比),并且在经过一段时间后才会调用下游服务。此行为可防止级联中出现大量错误。它类似于一个智能红绿灯,它会变红并且不让你通过,因为它知道你稍后会出事故。经过可配置的时间后,电路再次闭合。 您可以在 Hystrix 仪表板看到 'Circuit opened / closed':

Chris Richardson 在 pattern - circuit breaker

也对此进行了很好的解释

Hysterix是用来阻止级联故障的,我举个例子来解释一下我的意思: 假设您有 3 个组件:1) 前端,2) 后端 A 和 3) 后端 B。
前端与后端 A 对话,后端 A 要求后端 B 进行某种查找。 前端每秒接收 50k 个请求,这意味着 50k 个请求将发送到后端 A,另外 50k 个请求将发送到后端 B。如果后端 B 变得不健康,则表示您在后端 B 到后端 A 之间打开了 50k 个套接字,而另一个后端 A 和前端之间打开 50k 套接字。最终会发生的是事务中涉及的所有服务器都将开始挂起,因为所有套接字都保持打开状态。套接字将以每秒 50k 的速度填满,超时为 20 秒,即每台服务器之间有 100 万个打开的套接字!后端 B 超时的结果将意味着对后端 A 的请求将超时,这将意味着对前端的请求也将超时。 Hysterix(或熔断的想法)几乎引入了一个开关,当服务器变得不健康时,它将有某种方式来处理错误,例如停止所有未来的请求并立即给出预定义的响应,从而导致套接字立即关闭,没有发生级联故障。这会提高弹性和更好的容错能力。

正如你所说,它可以简单地包装在 try-catch 块下那么为什么选择 Hystrix 或其他一些库? 我经历了什么:

  • 已经 test proven 个图书馆。
  • 能够skip original intended calls and fallback。请注意,如果您将其包装在 try-catch 下,仍然会尝试连接和发送命令,但最终会由于依赖性降低而超时。在通话前了解此信息将使您能够跳过通话一段时间(根据配置),您可以节省这些资源
  • 也使用Sliding Time Window提供熔断
  • Metrics and Dashboarding 开箱即用,可帮助您查看系统和相关连接
  • 通过使用不同的 Thread Pools
  • 实现 BulkHead
  • 降低维护成本
  • 健康检查能力。它提供健康检查 class,其中插件带有健康监控 API