Hystrix-简介

#Hystrix 简介
Excuse me? 头戴金冠 北极熊??
set up-w300

Netflix(世界最大在线影片租赁服务商)开源的延迟容错工具包,用于隔离分布式系统之间的依赖访问。防止级联故障,使得复杂的分布式系统在错误不可避免的条件下仍具有弹性,具有自我保护的能力。

Where does the name from?

set up-w300

功能:

  • 防护并控制因依赖第三方服务导致的延时和故障;
  • 阻止级联故障;
  • 快速失败并且能快速恢复;
  • 支持失败降级和提供优雅的服务降级机制;
  • 支持近实时监控、报警以及操作控制。

应用场景:

在复杂的分布式系统里会有很多依赖,每个依赖都会不可避免地在某些时候发生故障。如果主应用没有隔离这些故障,那么就有被拖垮的风险。(mmdb大面积超时就是最有说服力的🌰)
Hystrix官网给出了这样一个例子:

一个应用依赖30个外部服务,每个服务的可用性为99.99%,那么主应用的可用性即为99.99^30 = 99.7%
0.3%的故障率意味着每月有2+小时的时间服务不可用。可用性是相当差的
当服务依赖数越多时,整体可用性越差

服务正常运行时,如下图所示:

当有一个后台系统延时较高时,会阻塞整个用户的请求:


在高并发的场景下,单个后台依赖接口超时后会造成所有服务器上的资源都被耗尽,造成更多级联故障。

因此,所有这些延时和故障都应该被隔离和管理,使得单个接口故障不会拖累整个应用。

设计原则

  • 通过线程隔离来防止单个依赖耗尽所有的容器内所有用户线程;
  • 在系统无法及时处理请求时快速失败,而不是入队,以降低系统负载;
  • 提供失败降级,在必要的时候让失效对用户透明。
  • 利用隔离术(舱壁、泳道、熔断器模式)来隔离单个依赖对整个系统的影响;
  • 针对系统服务的度量、监控、报警,提供优化以满足近实时性的需求;
  • Hystrix的大部分属性都支持动态配置并且快速应用,从而可以辅助我们做实时的操作修改;
  • 可以隔离应用整个执行过程中失败的影响,而不仅仅在网络通信中。

实现原理

  • 将所有对外部系统的调用都包装在命令模式的对象 HystrixCommand or HystrixObservableCommand中,它通过在一个隔离的线程中执行远程调用。
  • 默认情况下,支持自动超时机制,也支持人工配置超时时间(995线)。
  • 对于每个依赖都维持一个线程池,如果线程池变满了,则立即拒绝而不是排队。
  • 记录成功、失败、超时和被线程拒绝的请求数
  • 引入断路器机制以阻断一段时间内对特定服务的访问。支持手动开启断路器,或者根据失败率自动开启模式。
  • 在请求失败、超时、拒绝时,可以执行降级逻辑。
  • 监控计量数据和配置修改信息并支持近实时地修改配置。

当使用Hystrix来包装每个依赖服务时,上面的架构即变为如下图所示。其中每个依赖都相互隔离,当延迟发生时只会耗尽其内部资源而不影响其他资源,同时也覆盖了降级逻辑用于依赖服务发生错误时向用户返回信息。

参考:

  1. Hystrix
您的支持是我创作源源不断的动力