• 熔断、降级、限流


    熔断(circuit break

      保险丝:当电路发生故障或异常时,伴随着电流不断升高,并且升高的电流有可能损坏电路中的某些重要器件,也有可能烧毁电路甚至造成火灾。若电路中正确地安置了保险丝,那么保险丝就会在电流异常升高到一定的高度和热度的时候,自身熔断切断电流,从而起到保护电路安全运行的作用

      服务熔断的作用类似于保险丝,当下游某服务出现不可用或响应超时的情况时,上游服务为了保护系统整体的可用性,暂时停止对该服务的调用。

       这种局部牺牲,保全整体的措施就叫做熔断。

      如:前系统中有A,B,C三个服务,服务A是上游,服务B是中游,服务C是下游。它们的调用链如下 A——>B——>C

      当下游服务C因为某些原因变得不可用,积压了大量请求,服务B的请求线程也随之阻塞。线程资源耗尽,使得B服务也变得不可用。紧接着服务A也变得不可用,整个调用链路被拖垮。

      这种调用链路的连锁故障,叫做雪崩。

      这种情况下,就需要使用熔断机制来挽救整个系统。熔断分为熔断开启和熔断恢复:

        1、熔断开启

        在固定时间窗口内,接口调用超时比率达到一个阈值,会开启熔断。进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的默认方法,达到服务降级的效果。

        2、熔断恢复

        熔断不可能是永久的。当经过了规定时间之后,服务将从熔断状态回复过来,再次接受调用方的远程调用。

       熔断实现

        Spring Cloud Hystrix是基于Netflix的开源框架Hystrix实现,该框架实现了服务熔断、线程隔离等一系列服务保护功能。

    对于熔断机制的实现,Hystrix设计了三种状态:

        1.熔断关闭状态(Closed)

          服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。

           2.熔断开启状态(Open)

          在固定时间窗口内(Hystrix默认是10秒),接口调用出错比率达到一个阈值(Hystrix默认为50%),会进入熔断开启状态。进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。

        3.半熔断状态(Half-Open)

          在进入熔断开启状态一段时间之后(Hystrix默认是5秒),熔断器会进入半熔断状态。所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断关闭状态。

    降级

      为了预防某些功能出现负荷过载或者响应慢的情况,在其内部暂时舍弃一些非核心接口和数据的请求,而直接返回一个提前准备好的 fallback(退路) 错误处理信息。以保证整个系统的稳定性和可用性。

      

      服务降级分容错降级和屏蔽降级两种模式

      1、屏蔽降级:

        在一个实例中,服务之间尽管可以通过线程池隔离方式实现资源隔离,但是100%的隔离是不现实的。特别是对缓存、网络IO,磁盘IO、内存、CPU、数据库连接资源等公共依赖无法隔离,在业务高峰期或者大促时,服务之间往往存在激烈的竞争,导致核心服务(如双十一下单)运行质量下降,影响系统的稳定运行和客户体验。

        屏蔽降级需要手动操作,当外界的触发条件达到某个临界值时,由运维/开发人员决策,通过服务治理控制台,对某个服务进行人工降级操作。当系统压力恢复正常时,可以对已经屏蔽降级的服务恢复正常。

        降级策略:返回null、返回指定异常、执行本地mock接口实现

      2、容错降级:

        当非核心服务不可用时,可以对故障服务做业务逻辑放通。当然,容错降级不仅仅用于业务放通,它也常用于服务提供方在执行容错逻辑,包括RPC异常、service异常等。

        容错降级策略:

          1)将异常转义

          2)将异常屏蔽掉,直接执行本地模拟接口实现类,返回mock接口的执行结果

    熔断与降级比较:

      相同点 不同点
    熔断

    目标一致 都是从可用性和可靠性出发,为了防止系统崩溃;

    用户体验类似,最终都让用户体验到的是某些功能暂时不可用;

    触发原因不同 服务熔断一般是某个服务(下游服务)故障引起
    降级 服务降级一般是从整体负荷考虑;

    限流(flow limiting)

      可使用阿里的Sentinel限流工具:https://github.com/alibaba/Sentinel

    END.

  • 相关阅读:
    博客样式备份
    2018年终总结
    技术博客的太监
    LeetCode 日常填坑
    互联网之父
    TotoiseSVN的使用方法
    常用CMD命令
    量化策略
    浏览器加载js的阻塞与非阻塞
    Vue核心之数据劫持
  • 原文地址:https://www.cnblogs.com/yangyongjie/p/13779360.html
Copyright © 2020-2023  润新知