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

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

1、DegradeSlot 概述


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

3a0daca0124e28e6dd0726ea82f77122.png

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


DegradeRuleManager#checkDegrade

376bc199953862a268442b48d9adcf1f.png

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


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


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


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


2、DegradeRule 详解


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

dc7370929f6e6aa1de7a1f603528fd06.png

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


2.1 DegradeRule 类图


dc3f2ba07ad0fd868c1ff6c0731998d9.png

  • 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 基于集群的限流策略。


相关文章
|
6月前
|
缓存 数据安全/隐私保护 Sentinel
断路精灵:探秘Sentinel熔断策略的神奇效果
断路精灵:探秘Sentinel熔断策略的神奇效果
94 0
|
5月前
|
监控 Java Sentinel
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
151 3
|
30天前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
1月前
|
运维 监控 算法
聊一聊Sentinel背后的原理
本文介绍了Sentinel的核心原理,包括流量控制、熔断降级、系统负载保护、实时监控和统计、与多种微服务框架的集成能力以及扩展性,强调了Sentinel在保障分布式系统稳定性方面的重要性。
118 0
|
2月前
|
监控 Java API
谷粒商城笔记+踩坑(25)——整合Sentinel实现流控和熔断降级
先简单介绍熔断、降级等核心概念,然后阐述SpringBoot整合Sentinel的实现方式,最后介绍Sentinel在本项目中的应用。
谷粒商城笔记+踩坑(25)——整合Sentinel实现流控和熔断降级
|
3月前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。
|
5月前
|
监控 Java API
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
131 0
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
|
5月前
|
监控 Java 应用服务中间件
Sentinel原理及实践
Sentinel原理及实践
103 1
|
5月前
|
自然语言处理 监控 开发者
springCloud之Sentinel流量路由、流量控制、流量整形、熔断降级
springCloud之Sentinel流量路由、流量控制、流量整形、熔断降级
116 0
|
6月前
|
SpringCloudAlibaba 监控 Java
SpringCloud Alibaba Sentinel实现熔断与限流--学习笔记
SpringCloud Alibaba Sentinel实现熔断与限流--学习笔记
108 0