hystrix是netflix开源的一个容灾框架,解决当外部依赖故障时拖垮业务系统、甚至引起雪崩的问题。
官方文档:https://github.com/Netflix/Hystrix/wiki
一、Hystrix简介
1.一般现有的服务结构,在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络连接缓慢,资源繁忙,暂时不可用,服务脱机等.
2.当依赖中有一个服务出现问题 可能会导致整个服务不可用
3.当出现这种问题应该如何解决?
依赖间进行隔离,Hystrix就是处理依赖隔离的框架,同时也是可以帮我们做依赖服务的治理和监控.
4.Hystrix设计原则
Hystrix works by:
- Preventing any single dependency from using up all container (such as Tomcat) user threads.
- Shedding load and failing fast instead of queueing.
- Providing fallbacks wherever feasible to protect users from failure.
- Using isolation techniques (such as bulkhead, swimlane, and circuit breaker patterns) to limit the impact of any one dependency.
- Optimizing for time-to-discovery through near real-time metrics, monitoring, and alerting
- Optimizing for time-to-recovery by means of low latency propagation of configuration changes and support for dynamic property changes in most aspects of Hystrix, which allows you to make real-time operational modifications with low latency feedback loops.
- Protecting against failures in the entire dependency client execution, not just in the network traffic.
- 防止任何单个依赖项耗尽所有容器(如Tomcat)用户线程。
- 卸载和快速失败而不是排队
- 在任何可行的地方提供后备措施,以保护用户不受失败的影响。
- 使用隔离技术(如隔离壁、泳道和断路器模式)来限制任何一个依赖项的影响。
- 通过接近实时的度量、监视和警报来优化发现时间
- 通过在Hystrix的大部分方面,通过低延迟的配置更改和对动态属性更改的支持来优化时间到恢复,这使得您可以通过低延迟反馈循环进行实时操作修改。
- 保护整个依赖客户端执行中的失败,而不仅仅是在网络流量中。
二、Hystrix如何解决依赖隔离
- Hystrix使用命令模式HystrixCommand(Command)包装依赖调用逻辑,每个命令在单独线程中/信号授权下执行。
- 可配置依赖调用超时时间,超时时间一般设为比99.5%平均时间略高即可.当调用超时时,直接返回或执行fallback逻辑
- 为每个依赖提供一个小的线程池(或信号),如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。
- 依赖调用结果分:成功,失败(抛出异常),超时,线程拒绝,短路。 请求失败(异常,拒绝,超时,短路)时执行fallback(降级)逻辑。
- 提供熔断器组件,可以自动运行或手动调用,停止当前依赖一段时间(10秒),熔断器默认错误率阈值为50%,超过将自动运行。
- 提供近实时依赖的统计和监控。
三、Hystrix流程解析
流程说明:
1``:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.
2``:执行execute()/queue做同步或异步调用.只适用与简单的HystrixCommand;
observe()
/toObservable()
适用与HystrixObservableCommand
3:判断响应缓存 如果存在的话就立即返回
4:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤``8``,进行降级策略,如果关闭进入步骤.
5:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤``8``,否则继续后续步骤.
6:调用HystrixCommand的run方法.运行依赖逻辑
6a:返回成功调用结果
6b:调用出错或超时,进入步骤``8``.
7``:计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态.
8``:getFallback()降级逻辑.
以下四种情况将触发getFallback调用:
(``1``):run()方法抛出非HystrixBadRequestException异常。
(``2``):run()方法调用超时
(``3``):熔断器开启拦截调用
(``4``):线程池/队列/信号量是否跑满
8a:没有实现getFallback的Command将直接抛出异常
8b:fallback降级逻辑调用成功直接返回
8c:降级逻辑调用失败抛出异常
9``:返回执行成功结果
四、Circuit Breaker和隔离分析
每个熔断器默认维护10个bucket,每秒一个bucket,每个bucket记录成功,失败,超时,拒绝的状态;
隔离:(1)线程和线程池隔离 (2)信号量