Hystrix

作者: 常晓csc | 来源:发表于2020-03-25 16:08 被阅读0次

    hystrix是netflix开源的一个容灾框架,解决当外部依赖故障时拖垮业务系统、甚至引起雪崩的问题。

    官方文档:https://github.com/Netflix/Hystrix/wiki

    一、Hystrix简介

    1.一般现有的服务结构,在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络连接缓慢,资源繁忙,暂时不可用,服务脱机等.

    1.png

    2.当依赖中有一个服务出现问题 可能会导致整个服务不可用

    2.png 3.png

    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.
    1. 防止任何单个依赖项耗尽所有容器(如Tomcat)用户线程。
    2. 卸载和快速失败而不是排队
    3. 在任何可行的地方提供后备措施,以保护用户不受失败的影响。
    4. 使用隔离技术(如隔离壁、泳道和断路器模式)来限制任何一个依赖项的影响。
    5. 通过接近实时的度量、监视和警报来优化发现时间
    6. 通过在Hystrix的大部分方面,通过低延迟的配置更改和对动态属性更改的支持来优化时间到恢复,这使得您可以通过低延迟反馈循环进行实时操作修改。
    7. 保护整个依赖客户端执行中的失败,而不仅仅是在网络流量中。

    二、Hystrix如何解决依赖隔离

    1. Hystrix使用命令模式HystrixCommand(Command)包装依赖调用逻辑,每个命令在单独线程中/信号授权下执行。
    2. 可配置依赖调用超时时间,超时时间一般设为比99.5%平均时间略高即可.当调用超时时,直接返回或执行fallback逻辑
    3. 为每个依赖提供一个小的线程池(或信号),如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。
    4. 依赖调用结果分:成功,失败(抛出异常),超时,线程拒绝,短路。 请求失败(异常,拒绝,超时,短路)时执行fallback(降级)逻辑。
    5. 提供熔断器组件,可以自动运行或手动调用,停止当前依赖一段时间(10秒),熔断器默认错误率阈值为50%,超过将自动运行。
    6. 提供近实时依赖的统计和监控。

    三、Hystrix流程解析

    4.png

    流程说明:
    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)信号量

    相关文章

      网友评论

          本文标题:Hystrix

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