Sentinel 熔断降级原理

一、概述

对于熔断这个概念,我们并不陌生,比如股市熔断机制,当股指波幅达到规定的熔断点时,交易所为控制风险采取的暂停交易措施。亦或者是电流熔断,当通过的电流超出导线所能成再的最大电流时,会触发保险丝熔断,从而避免因为电流过大造成火灾。

在这些场景中,可以发现一个共同的特点,就是熔断在这些场景中都是充当保护机制,避免引发更大的问题。那么在整个微服务架构中,也同样会存在类似的问题。

二、服务熔断

在微服务架构中,一个请求过来,可能会经过多个服务进行处理,导致整个处理链路会比较长。而在整条调用链路中,可能会因为某个节点因为网络故障导致响应时间比较长,而这个节点的阻塞将会影响这条链路的结果返回。
当访问量比较高的请求下,一个后端依赖节点的延迟响应可能导致所有服务器上的所有资源在数秒内饱和。一旦出现这个问题,会导致系统资源被快速消耗,从而导致服务宕机等问题,最坏的情况会导致服务雪崩。

为了防止这种问题的产生,也引入了熔断的概念。

所以,熔断的意义:是为了起到保护作用,如果某个目标服务调用比较慢或者大量的超时,这个时候如果触发熔断机制,则可以保证后续的请求不会继续发送到目标服务上,而是直接返回降级的逻辑并且快速释放资源。如果目标服务的情况恢复了,那么熔断机制又会动态进行关闭。

三、Sentinel中熔断

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断。

在Sentinel中判断资源是否处于稳定状态的指标或者纬度:

  • 慢调用比例(SLOW_REQUEST_RATIO)
  • 异常比例(ERROR_RATIO)
  • 异常数(ERROR_COUNT)

Sentinel中提供了DegradeRule对象来实现规则设置,核心属性如下:

  • resource,资源名称
  • count, 阈值,[异常比例/异常数模式下为对应的阈值,慢调用比例模式下为慢调用临 界 RT]
  • grade,熔断模式,根据RT降级、根据异常比例、根据异常数量
  • timeWindow,熔断时间,单位为秒

3.1、慢调用比例(SLOW_REQUEST_RATIO)

在一定请求次数中,一段时间内,如果有一定比例的请求响应时间大于某一个阈值,则认为目标服务异常,则在接下来的指定时间内,请求都会被自动熔断。当经过熔断时长后,熔断器会进入到探测恢复状态,若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

参数设置(1s内连续发送10个请求,在1分钟以内,其中20%的请求平均响应时间都超过3s,则触发熔断,熔断时间为5s)

DegradeRule rule = new DegradeRule(RESOURCE_KEY).setGrade(CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType())
// Max allowed response time.setCount(3000)
// Retry timeout (in second).setTimeWindow(5)
// Circuit breaker opens when slow request ratio > 20%.setSlowRatioThreshold(0.2).setMinRequestAmount(10).setStatIntervalMs(60000);
  1. grade=CircuitBreakerStrategy.SLOW_REQUEST_RATIO, (熔断模式)
  2. count=3000,最大的响应时间,单位为(毫秒)
  3. TimeWindow=5 (单位为s)
  4. minRequestAmount=5,最小请求数量,请求数量小于这个值,即时异常比例超出阈值也不会熔断,默认是5次。
  5. slowRatioThreshold=0.2,慢调用比例阈值,仅仅在慢调用比例模式下有效。
  6. statIntervalMs=1000*60, 统计时长为60秒,默认为1秒

3.2、异常比例 (ERROR_RATIO)

当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值时,则触发熔断,配置方式如下

  1. grade=CircuitBreakerStrategy.ERROR_RATIO
  2. count(异常比例),范围[0.0 , 1.0],代表0%~100%
  3. TimeWindow=5 (单位为s)
  4. minRequestAmount,最小请求数量,请求数量小于这个值,即时异常比例超出阈值也不会熔断,默认是5次。

3.3、异常数量(ERROR_COUNT)

当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

  1. grade=CircuitBreakerStrategy.ERROR_COUNT
  2. count(异常数量)
  3. timeWindow=5 (熔断时间窗口,单位为s)
  4. statIntervalMs=60*1000(统计时长,单位为ms)

当资源近1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

四、总结

限流、熔断和服务降级是系统容错的重要设计模式,从一定意义上讲限流和熔断也是一种服务降级的手段。

熔断和服务降级主要是针对非核心业务功能,而核心业务如果流程超过预估的峰值,就需要进行限流。

对于限流,选择合理的限流算法很重要,令牌桶算法优势很明显,也是使用最多的限流算法。

在系统设计的时候,这些模式需要配合业务量的预估、性能测试的数据进行相应阈值的配置,而这些阈值最好保存在配置中心,方便实时修改。

Sentinel 熔断降级原理相关推荐

  1. sentinel 熔断降级

    sentinel 熔断降级 官网:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html 熔断降级 熔断降级:服务由于响应慢.异常等原因触发 ...

  2. SpringCloud Alibaba Sentinel 熔断降级 - 程序配制方式实现

    一.Sentinel 上篇文章我们讲解了Sentinel 流控规则的配制,本篇文章我们继续讲下Sentinel 的熔断降级,依然采用程序配制方式实现. 上篇文章地址:https://blog.csdn ...

  3. Sentinel熔断降级

    # 0.说明 - https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7 - 除了流量控制以外,对调 ...

  4. 面试官:熔断降级原理是什么?

    仅以两张图来初步形容一下 熔断 适用的场景: 雪崩 股灾   什么是熔断 来自 wiki 的 熔断机制 描述: 熔断机制(英语:Circuit breaker / Trading curb)指的是在股 ...

  5. SpringCloud Sentinel 熔断降级、热点参数限流、与系统自适应限流介绍与配置

    一.熔断降级介绍与配置 概述:除了上一章节讲解的sentinel的流量控制之外,sentinel还提供了熔断降级功能.与处理高并发的系统自我保护机制不同的是,熔断降级主要防止当前接口不可用时,导致依赖 ...

  6. 微服务高可用利器——Hystrix熔断降级原理实践总结

    前言 最近在工作中参与组内服务稳定性建设,梳理我们目前服务现状并接入公司自研稳定性保障平台.对公司内自研组件以及业界流行的Hystrix做了学习,Netflix Hystrix 里面大量RxJava响 ...

  7. Spring Cloud Alibaba:Sentinel 熔断降级

    1. 前言 Sentinel版本:1.8.0 1.8.0 对熔断特性做了大量升级,低于此版本的谨慎参考 2. 熔断策略 2.1 慢调用比例 最大 RT(即最大的响应时间):请求的响应时间大于RT则统计 ...

  8. Spring Cloud Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    文章目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashbo ...

  9. 玩转Sentinel流量控制/熔断降级自定义异常和兜底数据返回

    目录 开篇介绍: Sentinel有2种规则: 流控设置面板的介绍: 基于并发线程数进行限流配置验证 流量控制的效果有几种? Sentinel熔断降级规则 服务调用常见的熔断状态和恢复 代码演示服务调 ...

最新文章

  1. Linux(CentOS) 如何查看当前占用CPU或内存最多的K个进程
  2. cuda的shared momery
  3. (5)呼吸灯systemverilog与VHDL编码
  4. 微课--Python正则表达式语法与应用(83分钟)
  5. 注册制后st还有投资价值吗?
  6. Mycat-server-1.6.5 常见分片方式
  7. mysql5.7不区分大小写_转载:mysql5.7设置不区分大小写
  8. 零基础学启发式算法(6)-蚁群算法 (Ant Colony Optimization, ACO)
  9. 单源最短路(SPFA算法)
  10. python深度学习进阶之行为检测详细学习路线(主要实现人员的行为类别、空间定位、时间定位)
  11. 使用Graphics在鼠标点击画圆圈扩散效果
  12. 垃圾小白羊的leetcode刷题记录6
  13. 我看无损音频APE和FLAC
  14. 一图掌握ISACA五大资格证书体系
  15. 了解DN、RDN和CN
  16. 完全数,丰沛数,不足数
  17. 计算机网络复习记录 (2)Chap 4
  18. (二)模仿学习-DAO数据的模仿
  19. itchat微信好友信息统计(性别区域)
  20. SpringBoot集成WebSocket

热门文章

  1. HIT CSAPP LAB7
  2. 基于Mathcad的LLC公式推导与化简(二)
  3. 阿里推“码上淘”发力O2O,坐不住的都有谁?
  4. win10 gtx1660ti 配置vs opencv cuda加速
  5. HTG评论D-Link DIR-880L:易于远程访问的简单主力机
  6. 【数据结构】顺序表(C++)
  7. 千万别被这三种人纠缠
  8. java初级工程师必须具备的十三个技能点
  9. 程序员被裁员是一种什么样的体验?N+1违约金维权经过。
  10. flutter methodchannel调用原生方法,实现原生插件