php熔断机制实现,RPC实现原理之核心技术-限流熔断

熔断降级源码

DegradeRule.passCheck方法:@Override

public boolean passCheck(Context context, DefaultNode node, int acquireCount, Object... args) {

if (cut.get()) {

return false;

}

ClusterNode clusterNode = ClusterBuilderSlot.getClusterNode(this.getResource());

if (clusterNode == null) {

return true;

}

if (grade == RuleConstant.DEGRADE_GRADE_RT) {

// 按平均响应时间降级

double rt = clusterNode.avgRt();

if (rt < this.count) {

passCount.set(0);

return true;

}

// Sentinel will degrade the service only if count exceeds.

// 超出最大RT时间进行降级

if (passCount.incrementAndGet() < RT_MAX_EXCEED_N) {

return true;

}

} else if (grade == RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) {

// 按照异常比例降级

double exception = clusterNode.exceptionQps();

double success = clusterNode.successQps();

double total = clusterNode.totalQps();

// if total qps less than RT_MAX_EXCEED_N, pass.

if (total < RT_MAX_EXCEED_N) {

return true;

}

double realSuccess = success - exception;

if (realSuccess <= 0 && exception < RT_MAX_EXCEED_N) {

return true;

}

if (exception / success < count) {

return true;

}

} else if (grade == RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) {

// 按照异常数降级

double exception = clusterNode.totalException();

if (exception < count) {

return true;

}

}

if (cut.compareAndSet(false, true)) {

ResetTask resetTask = new ResetTask(this);

// 设定重置时间窗调度任务

pool.schedule(resetTask, timeWindow, TimeUnit.SECONDS);

}

return false;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值