弹性应用的开发利器Hystrix

Flow Chart

(1) 构建HystrixCommand command对象

每一个依赖调用的HystrixCommand 对象将通过必要的参数进行构造,然后对服务进行调用。

如:

HystrixCommand command = new HystrixCommand(arg1, arg2)

(2)同步或异步执行

command的执行可以是同步的也可以使异步的。

//同步执行 K value = command.execute() //异步执行 Future value = command.queue()

除非command被指定为不在一个线程里执行,同步方法通过执行execute()并激活queue().get() 实现

(3) 是否开路?

一旦command执行之后,它首先通过熔断器进行检查,“是否开路” 假如时开路,command将不在执行,直接路由到(8)HystrixCommand.getFallback().

假如是闭路。command将执行(4)核查是否有有效的容量执行command

(4)线程池/队列/信号是否超额 如果和command关联的线程池,队列,信号(假如不在同一个线程中)超额,执行将被拒绝,并立即通过(8)HystrixCommand.getFallback().路由

(5) HystrixCommand.run() run() 方法的具体实现被执行

(5a)command执行超时

假如command被配置在同一个线程中运行,并且run()方法超过了commnad的超时的值,则该线程江抛出一个TimeoutException例外。在这种情况下,响应将路由到(8)HystrixCommand.getFallback()并且run()方法的返回值讲被丢弃(假如它没有被取消或中断)

不在同一个线程中运行的command,该逻辑不适应。

(6) command运行是否成功 应用的流程基于(5) HystrixCommand.run()方法的执行被路由。

(6a)成功响应

假如没有例外被抛出并且返回一个响应,经过一些日记和metrics报告后,command返回响应。

(6b) 响应失败 当响应抛出一个例外,Hystrix将其标示为“失败‘ --这将潜在的触发熔断机制- 将被路由到(8) HystrixCommand.getFallback().

(7) 计算电路的健康

成功,失败,拒绝和超时都被报告给断路器,并保持一组滚动的计数器集用于统计数据

这些统计数据用于决定电路是否”熔断“,达到某一点后,此后的请求都是短路的,直到恢复期过去,直到健康检查成功后,电路被再次”闭合“。

(8) HystrixCommand.getFallback() 当一个命令执行失败时,执行回退——当例外被(5)HystrixCommand.run()抛出时,当由于电路处于打开状态下,(3)命令处于短路状态,或(4)命令的线程池 队列或信号的超过其处理能力。

回退的目的是从内存缓存或者通过静态逻辑提供一个通用的响应,不需要任何网络依赖。

如果想要在回退中需要一个网络调用,则应当调用另一个HystrixCommand。

(8a) 回退没有实现

假如HystrixCommand.getFallback()没有完成,将抛出一个例外,调用者将负责处理它。

(8b) 回退成功

假如回退成功,将返回一个响应,并返回给调用者。

(8c) 回退失败

假如HystrixCommand.getFallback()调用失败,将抛出例外,调用者负责处理它

有回退实现,但是调用失败,这不是最佳实践。一个回退的实现最好是不实现任何导致再次失败的逻辑。

(9) 返回成功的响应

假如(6a)成功响应被接收打到,它将返回给调用者。