#Hystrix 简介
“Excuse me? 头戴金冠 北极熊??“
Netflix(世界最大在线影片租赁服务商)开源的延迟容错工具包,用于隔离分布式系统之间的依赖访问。防止级联故障,使得复杂的分布式系统在错误不可避免的条件下仍具有弹性,具有自我保护的能力。
功能:
- 防护并控制因依赖第三方服务导致的延时和故障;
- 阻止级联故障;
- 快速失败并且能快速恢复;
- 支持失败降级和提供优雅的服务降级机制;
- 支持近实时监控、报警以及操作控制。
应用场景:
在复杂的分布式系统里会有很多依赖,每个依赖都会不可避免地在某些时候发生故障。如果主应用没有隔离这些故障,那么就有被拖垮的风险。(mmdb大面积超时就是最有说服力的🌰)
Hystrix官网给出了这样一个例子:
一个应用依赖30个外部服务,每个服务的可用性为
99.99%
,那么主应用的可用性即为99.99^30
=99.7%
0.3%
的故障率意味着每月有2+小时的时间服务不可用。可用性是相当差的
当服务依赖数越多时,整体可用性越差
服务正常运行时,如下图所示:
当有一个后台系统延时较高时,会阻塞整个用户的请求:
在高并发的场景下,单个后台依赖接口超时后会造成所有服务器上的资源都被耗尽,造成更多级联故障。
因此,所有这些延时和故障都应该被隔离和管理,使得单个接口故障不会拖累整个应用。
设计原则
- 通过线程隔离来防止单个依赖耗尽所有的容器内所有用户线程;
- 在系统无法及时处理请求时快速失败,而不是入队,以降低系统负载;
- 提供失败降级,在必要的时候让失效对用户透明。
- 利用隔离术(舱壁、泳道、熔断器模式)来隔离单个依赖对整个系统的影响;
- 针对系统服务的度量、监控、报警,提供优化以满足近实时性的需求;
- Hystrix的大部分属性都支持动态配置并且快速应用,从而可以辅助我们做实时的操作修改;
- 可以隔离应用整个执行过程中失败的影响,而不仅仅在网络通信中。
实现原理
- 将所有对外部系统的调用都包装在命令模式的对象
HystrixCommand
orHystrixObservableCommand
中,它通过在一个隔离的线程中执行远程调用。 - 默认情况下,支持自动超时机制,也支持人工配置超时时间(995线)。
- 对于每个依赖都维持一个线程池,如果线程池变满了,则立即拒绝而不是排队。
- 记录成功、失败、超时和被线程拒绝的请求数。
- 引入断路器机制以阻断一段时间内对特定服务的访问。支持手动开启断路器,或者根据失败率自动开启模式。
- 在请求失败、超时、拒绝时,可以执行降级逻辑。
- 监控计量数据和配置修改信息并支持近实时地修改配置。
当使用Hystrix来包装每个依赖服务时,上面的架构即变为如下图所示。其中每个依赖都相互隔离,当延迟发生时只会耗尽其内部资源而不影响其他资源,同时也覆盖了降级逻辑用于依赖服务发生错误时向用户返回信息。
参考: