在分布式环境中,许多服务之间相关互相依赖,在这种复杂环境中总不可避免地会失败。Hystrix 就是解决这类问题的一个容错治理框架,它通过添加延迟容错和容错逻辑来帮助您控制在这种环境中分布式服务之间的交互。Hystrix 通过隔离服务之间的访问点、阻止它们之间的级联故障并提供回退选项来实现这一点,所有这些都为了提高系统的整体弹性。
Hystrix 由 Netflix API 团队于 2011 年开始的弹性工程工作演变而来。 2012 年,Hystrix 不断发展和成熟,Netflix 内部的许多团队都采用了它。如今,Netflix 每天通过 Hystrix 执行数百亿个线程隔离和数千亿个信号量隔离调用。保障了正常运行时间和弹性的显着改善。
Hystrix 旨在执行以下操作:
复杂分布式架构中的应用程序通常有成千上万个依赖项,每个依赖项可能会在某个时刻不可避免地失败。如果主机应用程序没有与这些外部故障隔离开来,它就有可能被它们拖垮。
例如,对于依赖 30 个服务的应用程序,其中每个服务的正常运行时间为 99.99%,您可以期待以下内容:
99.99 30 = 99.7% 的正常运行时间 10 亿次请求的 0.3% = 3,000,000 次故障 每月停机时间超过 2小时,即使所有依赖项都具有出色的正常运行时间。
但现实情况通常更糟。即使所有依赖项都表现良好,如果您不设计整个系统以实现弹性,即使是 0.01% 的停机时间对数十个服务中的每一个的总体影响也等同于每月潜在的几个小时停机时间。
当一切正常时,请求流可能如下所示:
(图一)
当后端系统中从多依赖服务中某个依赖项目不稳定(产生故障)时,它可以阻止整个用户请求:
(图二)
在面对大量流量冲击情景中,某个后端微服务的依赖变得不稳定时可能导致其所在服务器上的所有资源在短短数秒钟内变得饱和。
应用程序中通过网络或客户端库访问可能导致网络请求的每个点都是潜在故障的来源。比故障更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,耗尽级联系统中所有相关队列、线程和其他系统资源,从而导致整个系统出现大崩溃故障。
(图四)
当通过第三方客户端执行网络访问时,这些问题会更加严重——一个“黑匣子”,其中隐藏了实现细节并且可以随时更改,每个客户端库的网络或资源配置都不同,通常难以监控和改变。更糟糕的是传递依赖,它们执行潜在的昂贵或容易出错的网络调用,而没有被应用程序显式调用。网络连接失败或降级,服务和服务器出现故障或变慢;所有这些都代表需要隔离和管理的故障和延迟,以便单个失败的依赖项无法关闭整个应用程序或系统。
Hystrix 通过以下方式执行此操作:
HystrixCommand或HystrixObservableCommand
对象中,该对象通常在单独的线程中执行。(图五)
断路器的开关控制逻辑如下:
(图六)
当您使用 Hystrix 包装每个底层依赖项时,如图四所示的架构将更改为类似于下图。每个依赖项间彼此隔离,限制在发生延迟时,降低资源饱和度,并覆盖在回退逻辑中,该逻辑决定在依赖项中发生任何类型的故障时做出什么响应: