Hystrx权威指南--Hystrix执行流程
Hystrix的执行流程如图所示:
流程说明:
1.每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.
2.执行execute()/queue做同步或异步调用.
3.判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤.
4.判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤.
5.调用HystrixCommand的run方法.运行依赖逻辑
依赖逻辑调用超时,进入步骤8.
6.判断逻辑是否调用成功。返回成功调用结果;调用出错,进入步骤8.
7.计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态.
8.getFallback()降级逻辑。以下四种情况将触发getFallback调用:
- run()方法抛出非HystrixBadRequestException异常。
- run()方法调用超时
- 熔断器开启拦截调用
- 线程池/队列/信号量是否跑满
没有实现getFallback的Command将直接抛出异常,fallback降级逻辑调用成功直接返回,降级逻辑调用失败抛出异常.
9.返回执行成功结果
fallback条件
Name
|
Description
|
Triggers Fallback?
|
---|---|---|
FAILURE | execution threw an Exception | YES |
TIMEOUT | execution started, but did not complete in the allowed time | YES |
SHORT_CIRCUITED | circuit breaker OPEN, execution not attempted | YES |
THREAD_POOL_REJECTED | thread pool at capacity, execution not attempted | YES |
SEMAPHORE_REJECTED | semaphore at capacity, execution not attempted | YES |
EMIT |
value delivered (HystrixObservableCommand only) |
NO |
BAD_REQUEST |
execution threw a HystrixBadRequestException
|
NO |
SUCCESS | execution complete with no errors | NO |
任务执行失败,执行超时,依赖熔断,执行线程池满会fullback
熔断条件
熔断器实现三种类型的状态:open、half-open以及closed:
熔断执行流程:
- 当熔断器开关关闭时, 请求被允许通过熔断器. 如果当前健康状况高于设定阈值, 开关继续保持关闭. 如果当前健康状况低于设定阈值, 开关则切换为打开状态.
-
当熔断器开关打开时, 请求被禁止通过.
-
熔断器开关处于打开状态, 经过一段时间后, 熔断器会自动进入半开状态, 这时熔断器只允许一个请求通过. 当该请求调用成功时, 熔断器恢复;失败,将继续保持熔断状态
自动熔断机制
- 当外部依赖I访问出错比例达到某个阈值时,自动触发熔断,之后一小段时间duration(可配置)内访问I的请求自动被降级处理,不再发给A
- 过了设定的duration时间后,放过一个请求到依赖I,探测是否恢复正常,如果恢复正常,解除熔断,否则继续保持通信熔断状态。