专栏首页中间件兴趣圈源码分析 Sentinel DegradeSlot 熔断实现原理

源码分析 Sentinel DegradeSlot 熔断实现原理

1、DegradeSlot 概述


Sentinel 中的熔断实现类为 DegradeSlot。DegradeSlot 的类定义如下图所示:

由此可见,熔断主要实现逻辑定义在 DegradeRuleManager 的 checkDegrade 方法中。 DegradeRuleManager#checkDegrade

代码@1:首先从 degradeRules 熔断规则缓存中获取资源的熔断规则。

代码@2:遍历熔断规则列表。

代码@3:调用熔断规则 DegradeRule 的 passCheck,如果该方法返回 false,则表示需要熔断,则抛出 DegradeException 异常。

即实现熔断的核心逻辑在 DegradeRule 中。

2、DegradeRule 详解


在介绍 DegradeRule 之前我们先来看看 sentinel-dashboard 关于熔断降级规则的配置:

我们可以直观的得知,降级规则可以根据如下三个指标进行设置:RT(响应时间)、异常比例、异常数。

2.1 DegradeRule 类图

  • double count 上面配置规则中对应的配置值,例如当降级策略为RT时,表示设置的响应时间值,其他类似。
  • int timeWindow 降级发生后多久进行恢复,即结束降级,单位为毫秒。
  • int grade 降级策略,可以选值如下: 1)DEGRADE_GRADE_RT 响应时间。 2)DEGRADE_GRADE_EXCEPTION_RATIO 异常数比例。 3)DEGRADE_GRADE_EXCEPTION_COUNT 异常数量。
  • int rtSlowRequestAmount 触发 RT 响应熔断出现的最小连续慢响应请求数量。
  • int minRequestAmount 触发熔断最小的请求数量。

2.2 passCheck方法详解

根据当前请求的情况触发熔断的判断逻辑由 passCheck 方法实现。在介绍这个方法之前,我们根据该方法调用上下文得知,该方法返回 false,则触发熔断。 DegradeRule#passCheck

if (cut.get()) {
    return false;
}

Step1:如果当前正在处于熔断降级中,将直接返回 false,请求将被限流。

DegradeRule#passCheck

ClusterNode clusterNode = ClusterBuilderSlot.getClusterNode(this.getResource());
    if (clusterNode == null) {
        return true;
}

Step2:根据资源名称获得对应的集群类节点,有关集群限流将在后续文章中详细介绍。

DegradeRule#passCheck

if (grade == RuleConstant.DEGRADE_GRADE_RT) {
    double rt = clusterNode.avgRt();
    if (rt < this.count) {
        passCount.set(0);
        return true;
    }
    if (passCount.incrementAndGet() < rtSlowRequestAmount) {
        return true;
    }
}

step3:降级策略为基于响应时间的判断规则,其核心实现关键点:

  • 首先获取节点的平均响应时间。
  • 如果当前平均响应时间小于阔值,则放行,并重置 passCount 为 0。
  • 如果当前平均响应时间大于阔值,但连续次数小于 rtSlowRequestAmount,依然放行,只有当连续 rtSlowRequestAmount 次响应慢才会触发降级。

DegradeRule#passCheck

} else if (grade == RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) {
    double exception = clusterNode.exceptionQps();
    double success = clusterNode.successQps();
    double total = clusterNode.totalQps();
    if (total < minRequestAmount) {
        return true;
    }
   double realSuccess = success - exception;
    if (realSuccess <= 0 && exception < minRequestAmount) {
        return true;
    }
    if (exception / success < count) {
        return true;
    }
}

Step4:降级策略为根据异常比例,其判断规则核心如下:

  • 分别获取成功QPS,异常QPS,总TPS。
  • 如果当前总 QPS 小于 minRequestAmount,则直接返回成功,表示暂不进行熔断规则判断。
  • 如果成功数小于异常数并且异常数量小于 minRequestAmount,则返回true,表示暂不进熔断规则的判断。
  • 如果异常比例小于阔值,同样返回 true,表示暂不进熔断规则的判断。

DegradeRule#passCheck

else if (grade == RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) {
    double exception = clusterNode.totalException();
    if (exception < count) {
        return true;
    }        
}

Step5:降级策略为根据异常数量,这策略只是简单的判断错误数量即可。

DegradeRule#passCheck

if (cut.compareAndSet(false, true)) {
    ResetTask resetTask = new ResetTask(this);
    pool.schedule(resetTask, timeWindow, TimeUnit.SECONDS);
}

Step6:如果符合触发熔断的规则,则原子更新 cut,并且开启一个调度任务,在指定时间过后进行降级恢复。

Sentinel 的熔断机制实现比较简单,就介绍到这了,下一篇将介绍 Sentinel 基于集群的限流策略。

文章分享自微信公众号:
中间件兴趣圈

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Sentinel源码分析,了解Sentinel的整个工作流程

    从上一篇《Sentinel限流的核心功能QPS统计的实现原理》我们了解到,Sentinel统计QPS使用的是时间窗口+Bucket,并且通过循环复用Bucket...

    Java艺术
  • Sentinel与OpenFeign整合实现熔断降级源码分析

    Sentinel无论是实现限流还是熔断降级,其实都是通过适配模块去实现拦截方法的执行,在方法执行之前调用所有ProcessorSlot的entry方法,在方法执...

    Java艺术
  • Sentinel断路器与熔断降级【源码笔记】

    Sentinel的熔断降级通过断路器实现,本文通过介绍熔断器的定义、如何构建熔断器、断路器校验逻辑、断路器状态转换、异常/慢调用熔断流量是如何统计等方面梳理断路...

    瓜农老梁
  • 《一起学sentinel》六、Slot的子类及实现之FlowSlot和DegradeSlot

    在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架...

    M4Y
  • Sentinel 流控原理

    我们在项目中添加 Spring Cloud Sentinel 依赖添加后 spring-cloud-starter-alibaba-sentinel 在 Sp...

    没有故事的陈师傅
  • Sentinel: 分布式系统的流量防卫兵

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

    35岁程序员那些事
  • HyStrix替代方案限流降级框架 Sentinel 的原理和实践

    有 A 和 B 两个服务,服务 A 作为业务访问的入口直接暴露给用户使用,服务 B 由 A 调用,负责查询一部分供应商的信息,并在设定时间内返回。这时由于出现某...

    用户5927304
  • 结合 Sentinel 专栏谈谈我的源码阅读方法

    Sentinel 系列共包含15篇文章,主要以源码分析为手段,图文并茂的方式对 Sentinel 的架构设计理念、核心实现要点进行了一一剖析,并加以实战分析与思...

    丁威
  • 聊聊sentinel的SentinelWebAutoConfiguration

    本文主要研究一下sentinel的SentinelWebAutoConfiguration

    code4it
  • Sentinel使用原理sentinel-dashboardDubbo适配

    有关于sentinel的使用方法和工作原理,在官方文档中都有详细的介绍,并且源码中也已经给出了一系列的demo,以下是示例:

    spilledyear
  • SpringCloud项目引入Sentinel做流控

    sentinel是阿里推出的流控防护组件,随着hystrix不在维护,新的项目一般会选用 resilience4j 或者 Sentinel 进行代替,由于国内很...

    eeaters
  • 《一起学sentinel》四、Slot的子类及实现之LogSlot和StatisticSlot

    在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架...

    M4Y
  • 《一起学sentinel》二、初探sentinel的Slot

    在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架...

    M4Y
  • sentinel 滑动窗口统计机制

    sentinel的滑动窗口统计机制就是根据当前时间,获取对应的时间窗口,并更新该时间窗口中的各项统计指标(pass/block/rt等),这些指标被用来进行后续...

    luoxn28
  • 《一起学sentinel》三、Slot的子类及实现之NodeSelectorSlot和ClusterBuilderSlot

    在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架...

    M4Y
  • 快速学习-Sentinel 工作主流程

    在Sentinel 里面,所有的资源都对应一个资源名称以及一个Entry。Entry 要么通过对默认的主流框架的适配自动创建,要么通过调用API 显式创建;每一...

    cwl_java
  • 4.Sentinel源码分析— Sentinel是如何做到降级的?

    在我的第二篇文章里面2. Sentinel源码分析—Sentinel是如何进行流量统计的?里面介绍了整个Sentinel的主流程是怎样的。所以降级的大致流程可以...

    luozhiyun
  • 4.Sentinel源码分析— Sentinel是如何做到降级的?

    在我的第二篇文章里面2. Sentinel源码分析—Sentinel是如何进行流量统计的?里面介绍了整个Sentinel的主流程是怎样的。所以降级的大致流程可以...

    luozhiyun

扫码关注云+社区

领取腾讯云代金券