美文网首页Spring Cloud
Hystrix快速入门(2) Hystrix工作流程

Hystrix快速入门(2) Hystrix工作流程

作者: 沉沦2014 | 来源:发表于2018-08-30 10:49 被阅读140次
    转:https://blog.csdn.net/hry2015/article/details/78533758?ref=myread

    一. Hystrix的处理流程

    image.png
    1. 构造HystrixCommand或HystrixObservableCommand对象
      创建代码如下
    HystrixCommand command = new HystrixCommand(arg1, arg2); 
    HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);
    
    1. 执行Command 命令

    共有4种执行命令的方法,前2种只支持HystrixCommand ,后2种只支持HystrixObservableCommand

    • execute(): 同步阻塞直至从依赖服务返回结果或抛出异常
    • queue(): 异步模式,返回Future,Future封装返回的内容
    • observe() : 直接订阅Observable ,此对象包含了从依赖服务返回的结果
    • toObservable() : 返回Observable 对象,当你订阅他时,它会执行Hystrix命令并返回结果

    HystrixCommand.execute(): 实际调用queue()的方法

    public R execute() {
       return queue().get();
    }
    

    HystrixCommand.queue(): 实际调用toObservable()的方法

     public Future<R> queue() {
         final Future<R> delegate = toObservable().toBlocking().toFuture();
          ....
     }
    

    HystrixObservableCommand.observe():实际调用toObservable()的方法

    public Observable<R> observe() {
    ....
        final Subscription sourceSubscription = toObservable().subscribe(subject);
    ....
    

    通过以上的代码,我们可以知道:第1种是同步阻塞性调用,第2种是异步非阻塞性调用,第3、4种是基于发布-订阅响应式的调用。虽然是4种调用方式,其实际最后都是基于toObservable方法来实现的

    1. 判断结束是否有缓存
      如果请求缓存功能开启,并且请求在缓存命中,那么返回一个Observable,此对象包含请求的结束

    2. 判断短路器是否开启
      在执行命令时,Hystrix 如果发现断路器跳闸,那么hystix会跳到步骤8去执行回退(fallback)逻辑。如果断路器没有跳闸,则继续执行步骤5

    关于断路器打开和关闭的条件见本文的下方。

    1. 判断线程池/队列/信号资源是否满了
      如果命令关联的线程池和队列(或信号量)满了,则不会执行命令,会跳到步骤8去执行回退(fallback)逻辑

    2. 执行HystrixObservableCommand.construct()或HystrixCommand.run()

    执行HystrixCommand.run()或HystrixObservableCommand.construct()时,如果执行超时或者执行失败,则执行会跳到步骤8去执行回退(fallback)逻辑;如果正常结束,Hystrix 会记录一些日志和监控数据,并返回处理结果

    1. Calculate Circuit Health
      Hystrix向断路器报告成功、失败、拒绝和超时。断路器维护一组计数器来统计执行数据。

    2. 获取 Fallback逻辑
      当发生如下情况时,Hystrix会尝试执行回退(fallback)逻辑:

    • 在执行时construct() or run() ,跑出异常 (发生在步骤6.)
    • 断路器打开时,命令被断路 (发生在步骤4.)
    • 当执行命令时,依赖的线程池、队列或信号量满(发生在步骤5.)
    • 执行命令超时

    编写回退(fallback)逻辑时,这个逻辑里最好没有网络调用,只从内存中获取或者只有静态的逻辑,这个逻辑保证不会执行失败。如果非要通过网络去获取Fallback,你需要在使用其他HystrixCommand或HystrixObservableCommand封装请求,并且这个请求必须有fallback逻辑且值没有网络调用,只有静态逻辑

    1. Return the Successful Response
      返回执行结束或者Observable

    二. 断路器工作流程

    下图显示HystrixCommand或HystrixObservableCommand如何与HystrixCircuitBreaker及其逻辑和决策流程交互,包括计数器在断路器中的行为。

    image.png
    断路器开启关闭的规则如下:
    • 如果服务请求数量达到一定阈值(HystrixCommandProperties.circuitBreakerRequestVolumeThreshold)且如果服务请求失败的百分比超过阈值(HystrixCommandProperties.circuitBreakerErrorThresholdPercentage())…
    • 然后断路器的状态从CLOSED改变为OPEN.
    • 当断路器open时,它会短路所有经过此断路器的请求。
    • 经过一段时间(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()),接下来的第一个请求允许通过(此时断路器是处于HALF-OPEN状态)。 如果请求失败,断路器将在睡眠窗口持续时间内返回到OPEN状态。 如果请求成功,断路器状态将转换到CLOSED,又会转到逻辑1。

    相关文章

      网友评论

        本文标题:Hystrix快速入门(2) Hystrix工作流程

        本文链接:https://www.haomeiwen.com/subject/zirrwftx.html