您的位置:首页 > 编程语言 > Java开发

Spring-Cloud 熔断器 Hystrix

2017-11-17 16:23 483 查看

Hystrix是什么?

在分布式环境下,服务之间存在大量的依赖,其中有一些不可避免的会发生失败。Hystrix是一个类库,通过增加延迟容忍和容错逻辑,来帮助控制这些分布式服务之间的交互问题。Hystrix通过隔离服务之间的访问点,来阻止问题的传播,避免出现级联故障,并提供失败备选响应,所有这些措施提高了系统的整体服务弹性。

Hystrix历史

Hystrix 是2011 从Netflix API 团队发展而来。 2012 Hystrix持续发展并且成熟,并且有非常多的团队开始采用Hystrix。Netflix的许多团队采用了它。今天,数以百亿计的线程被隔离,每天在Netflix上通过Hystrix执行成百上千亿个信号,这显著改善了服务的弹性和服务时间。

Hystrix可以做什么

Hystrix被设计用来做如下事情:

保护系统间通过第三方客户端库(通常是通过网络)进行依赖调用的时延以及错误。
在复杂的分布式系统中,阻止错误的传播,避免级联故障。
快速迅速,快速恢复。
必要时,提供备选响应和优雅的服务降级。
提供近似实时的监控、报警和动态操控。

Hystrix解决了什么问题

运行在复杂分布式系统中的应用程序,存在大量的依赖关系,其中的每一个依赖服务都不可避免地会在某一点失败。如果主应用程序没有与这些依赖服务隔离开,那么它就存在被因为这些依赖失败而导致服务质量下降甚至挂掉的风险。

例如,对于一个依赖30个服务的应用程序,每个服务有99.99%的正常运行时间,以下是您所期望的:



但是实际情况要远比上面的计算值糟糕的多。
如果你不对整个系统的弹性进行设计,即使所有的依赖调用都能很好地完成,每一项依赖对整体集群只有0.01%的故障时间,那么它就相当于一个月会有好几个小时的故障时间。
当一切正常时,请求流如下图所示:



当众多后端系统中的一个成为休眠状态,便可以阻塞整个用户请求,如下图所示:



由于流量的巨大,一个后端依赖服务进入休眠后,可能导致所有服务器上的全部资源瞬间处于饱和状态。

使用网络或者第三方类库的应用程序,每一个点都可能是造成网络请求失败的潜在原因。比失败更糟糕的是,这些失败还可能导致服务间依赖调用的时延增加,从而在整个系统中造成更多的级联故障。



这些问题会变得更加严重,当网络访问通过第三方客户端进行网络访问时。因为第三方客户端就是一个“黑盒”,其实现细节被隐藏,并且随时可能发生变化,并且网络或资源配置对于每个客户库来说都是不同的,而且通常很难监控和更改。

更糟糕的是传递依赖关系,潜在的昂贵开销或故障网络的调用,并不被应用程序进行显式调用。
网络连接失败或降级。
服务和服务器失败或者变得缓慢。
新的库或服务部署,会改变应用的行为或性能特征。
客户端库有bug。

所有这些典型的失败和时延形式,都应该被隔离和管理起来,来避免单一的失败依赖造成整个应用或系统的失败。

Hystrix的设计原则是什么?

Hystrix的工作如下:

防止任何单个依赖项耗尽所有容器(如Tomcat)用户线程。
使用切负荷和快速失败来代替队列。
提供任何可行的失败备选机制,保证故障对用户不可见。
使用隔离技术(如隔板、泳道和断路器模式),来降低任何一个依赖项对整个应用或系统的影响。
通过近乎实时的指标采集、监视和警报来优化故障发现时间。
Hystrix在大部分方面,配置发生变化时可以更低延时的传播,以及对动态属性更改的支持,使得能够低延时的修改并生效,从而优化故障恢复时间。
不仅仅是在网络通信中,在整个依赖关系客户端执行过程中,都要保护系统应对失败的发生。

Hystrix是如何实现这些目标的?

Hystrix通过以下方式来实现:

使用命令模式,在HystrixCommand或HystrixObservableCommand对象对,包装所有对外部系统(或者“依赖”)的调用,使其运行在独立的线程中。
提出来的通话时间比你定义的阈值要长。有一个默认值,但对于大多数依赖项,您可以通过“属性”来定制这些超时,因此它们的值略高于每一个依赖项的99.5百分位数性能。
每个服务都维护一个小的线程池(或信号量),如果满了,则应立即拒绝对该服务的请求,而不是对请求排队。
记录调用的成功、失败(客户抛出的异常)、超时和线程拒绝。
当某个特定服务的失败率超过阈值时,可以手动或自动的触发断路器,以阻断一定时间内的对该服务的所有请求。
当请求失败、被拒绝、超时或者短路时执行回退逻辑。
近乎实时的监控指标和配置变化。

当使用Hystrix来包装每个基础依赖服务时,如下图的架构所示,每个依赖服务在资源上彼此隔离开,当发生延时时,其独立的资源会饱和,回退逻辑决定何种类型的故障发生时该如何进行响应。



原文地址:https://github.com/Netflix/Hystrix/wiki
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: