Hystrix简介
Spring Cloud中的Hystrix是Netflix开源的一款针对分布式系统延迟和容错的库,其目的是通过添加延迟容忍和容错逻辑,从而控制分布式服务之间的交互。
对于一个复杂的分布式系统,包含的应用可能多达数十个,这些应用有许多依赖项目,每个依赖项目在某个时刻不可避免会失败导致故障,如果不对这些故障进行隔离,整个分布式系统都可能会崩溃。
借助官网的一个例子来说明,假设某个应用程序依赖30多个服务,每个服务正常运行的概率是99.99%,那么系统可用的概率是99.9930=99.7%,也就是说,每个服务出现故障的概率是0.3%,十亿个请求的故障就是3000000个,即使所有依赖具有出色的正常运行时间,每个月至少会有2小时以上的服务是不可用的,现实情况中,情况可能会更糟糕。
当一切正常时,请求情况如图1所示。
图1 一切正常的请求情况
当其中有一个系统有延迟时,它可能阻塞整个用户请求,具体如图2所示。
图2 系统出现延迟的情况
在高流量情况下,一个后端的依赖延迟可能会导致所有服务的资源在数秒内变的饱和,这也就意味着,后续如果再有请求将无法提供服务,应用会出现故障。比故障更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,从而备份队列、线程和其他资源,从而导致整个系统出现更多级联故障,如图3所示。
图3 系统出现更多级联故障情况
Hystrix的出现就是为了解决上述问题的,它封装了每个依赖项,每个依赖项彼此隔离,当延迟发生时,它会被限制在资源中,并包含回退逻辑,该逻辑决定在依赖发生任何类型故障时应作出何种响应。
使用Hystrix包装依赖项后,前面图中的架构会发生变化,如图4所示。
图4 使用Hystrix包装依赖后的架构
在图4中,Hystrix被设计的目标是阻止级联故障,对通过第三方客户端访问的依赖项的延迟和故障进行保护和控制。Hystrix实现这一目标的大致思路具体如下:
(1) 将外部依赖的访问请求封装在独立的线程中,进行资源隔离。
(2) 对于超出设定阈值的服务调用,直接进行超时,不允许其耗费过长时间阻塞线程。
(3) 每个依赖服务维护一个独立的线程池,一旦线程池满了,直接拒绝服务的调用。
(4) 统计依赖服务调用的成功次数、失败次数、拒绝次数、超时次数等结果。
(5) 在一段时间内,如果服务调用的异常次数超过一定阈值,就会触发熔断停止对特定服务的所有请求,在一定时间内对服务调用直接降级,一段时间后再次进行自动尝试恢复。
(6) 如果某个服务出现调用失败、被拒绝、超时等异常情况,自动调用fallback降级机制。
(7) 实时监控指标和配置变化。
关于Hystrix工作机制的深入分析将在后面小节详解,这里大家对Hystrix熔断机制有个大致了解即可。