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

上面配置规则中对应的配置值,例如当降级策略为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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值