sentinel是阿里的限流熔断工具,我今天正要在scg网关处使用sentinel来对下游api服务的调用加上限流熔断降级功能,看文档的时候关于限时降级我一直想的是当次请求不满足时长要求就要降级的,但是实际操作起来好像并不是这么回事。
sentinel降级的原理比较简要的概括就是:统计时间窗口内的指标,并且定时reset这些窗口属性值,每次请求过来再根据当前窗口的值判断是否满足要求决定是否降级
看下DegradeRule的passCheck方法中关于RT模式下的处理逻辑,这个很正常,差平均rt耗时判断是否满足要求
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.
if (passCount.incrementAndGet() < rtSlowRequestAmount) {
return true;
}
}
但是上面这个rt耗时是否把本次的rt算进去了?
我们通过找窗口统计指标addRtAndSuccess方法可以找到调用入口,在StatisticSlot里面的exit生命周期方法中:
同一个类中还有一个entry方法,和上面的exit正好是请求进来和拿到结果的周期方法:
通过debug断点我们能看到他是先走平均rt耗时判断后添加本次rt耗时的,所以,最后一根稻草的超时请求当次并不会降级,而是在下一次请求过来发生降级,至此简略分析完毕。。。
跟我需要的不太完全一致呀。。。当次rt是要等返回才能统计到没错,但是当次请求你也得给执行降级呀。。。 行吧。。。 先这么用吧。。。。