zoukankan      html  css  js  c++  java
  • Hystrix

    一、什么是Hystrix? 有什么用?

    总的来说:为了预防服务雪崩Hystrix - 什么是服务雪崩?,通过Hystrix的下面三点来预防服务雪崩:

    1. 资源隔离(线程池隔离):Hystrix - 资源隔离 (线程池模式+信号量模式)
    2. 断路器,
    3. 服务降级

    举个例子:

    “订单服务”调用“积分服务”的时候,一旦在“订单服务”内,分配给“积分服务”的hystrix线程池中的线程全被占用且无响应,

    “订单服务”的熔断器Circuit Breaker就会打开,不再调用实际的“积分服务”,改为调用降级逻辑。

    二、Hystrix流程图

    简版

    下图为Hystrix服务调用的内部逻辑:

      1. 构建Hystrix的Command对象, 调用执行方法.

      2. Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.

      3. 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.

      4. 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法.

      5. 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.

      6. 若服务执行超时, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.

      7. 若服务执行成功, 返回正常结果.

      8. 若服务降级方法getFallback执行成功, 则返回降级结果.

      9. 若服务降级方法getFallback执行失败, 则抛出异常.

    详细版

    流程说明:
    1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中。
    2:执行execute()/queue做同步或异步调用。
    3:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤。
    4:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤。
    5:调用HystrixCommand的run方法。运行依赖逻辑
    5a:依赖逻辑调用超时,进入步骤8。
    6:判断逻辑是否调用成功
    6a:返回成功调用结果
    6b:调用出错,进入步骤8。
    7:计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态。
    8:getFallback()降级逻辑。
    以下四种情况将触发getFallback调用:
    (1):run()方法抛出非HystrixBadRequestException异常
    (2):run()方法调用超时
    (3):熔断器开启拦截调用
    (4):线程池/队列/信号量是否跑满
    8a:没有实现getFallback的Command将直接抛出异常
    8b:fallback降级逻辑调用成功直接返回
    8c:降级逻辑调用失败抛出异常
    9:返回执行成功结果

  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/frankcui/p/15241869.html
Copyright © 2011-2022 走看看