阿里限流神器Sentinel夺命连环 17 问? (3)

strategy:判断的根据是资源自身(0),还是根据其它关联资源 (1),还是根据链路入口(2),默认值根据资源本身。

controlBehavior: 流控效果(直接拒绝(0) / 排队等待(2) / 预热冷启动(1)),默认值直接拒绝。

以上元素限流元素对应的类是com.alibaba.csp.sentinel.slots.block.flow.FlowRule,各元素如下图:

阿里限流神器Sentinel夺命连环 17 问?

注意:各个元素的取值以及默认值一定要记住,后续配置将会用到。

以上几个元素在sentinel控制台对应规则如下图:

阿里限流神器Sentinel夺命连环 17 问?

1、三种流控效果

流控效果总共分为三种,对应元素controlBehavior,分别如下:

快速失败

默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。

warm up

预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

注意:这一效果只针对QPS流控,并发线程数流控不支持。

预热底层是根据令牌桶算法实现的,源码对应得类在com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController。

算法中有一个冷却因子coldFactor,默认值是3,即请求 QPS 从 threshold(阈值) / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。

比如设定QPS阈值为3,流控效果为warm up,预热时长为5秒,如下图:

阿里限流神器Sentinel夺命连环 17 问?

这样配置之后有什么效果呢:QPS起初会从(3/3/=1)每秒通过一次请求开始预热直到5秒之后达到每秒通过3次请求。动态效果图如下:

阿里限流神器Sentinel夺命连环 17 问?

从上述动画可以清楚的看见:前几秒是频繁流控的,直到5秒,QPS阈值达到了3。

具体算法原理请看:https://github.com/alibaba/Sentinel/wiki/限流---冷启动

排队等待

匀速排队方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。源码对应得类:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

注意:这一效果只针对QPS流控,并发线程数流控不支持。

简单举个栗子:你去大学食堂吃饭,只有一个阿姨在打饭,那么所有人都要排队打饭,每次只有一个人打到饭,其他人都在排队等待。

不同的是sentinel有个超时等待时间,一旦超过这个预定设置的时间将会被限流。

该方式作用如下图:

阿里限流神器Sentinel夺命连环 17 问?

这种方式适合用于请求以突刺状来到,这个时候我们不希望一下子把所有的请求都通过,这样可能会把系统压垮;同时我们也期待系统以稳定的速度,逐步处理这些请求,以起到“削峰填谷”的效果,而不是拒绝所有请求。

比如设置QPS阈值为1,超时等待时间为10000毫秒,如下图:

阿里限流神器Sentinel夺命连环 17 问?

此时的效果如下:

阿里限流神器Sentinel夺命连环 17 问?

从上图可以看到:连续点击刷新请求,虽然设置了QPS阈值为1,但是并没有被限流,而是在等待,因为设置了超时等待时间为10秒。

具体算法原理请看:https://github.com/alibaba/Sentinel/wiki/流量控制-匀速排队模式

2、三种流控模式

流控模式总共分为三种,对应元素strategy,分别如下:

直接拒绝:接口达到限流条件时,直接限流

关联:当关联的资源达到阈值时,就限流自己

链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就可以限流)

下面来详细介绍下以上三种流控模式。

直接拒绝

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzxyf.html