strategy:判断的根据是资源自身(0),还是根据其它关联资源 (1),还是根据链路入口(2),默认值根据资源本身。
controlBehavior: 流控效果(直接拒绝(0) / 排队等待(2) / 预热冷启动(1)),默认值直接拒绝。
以上元素限流元素对应的类是com.alibaba.csp.sentinel.slots.block.flow.FlowRule,各元素如下图:
注意:各个元素的取值以及默认值一定要记住,后续配置将会用到。
以上几个元素在sentinel控制台对应规则如下图:
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秒,如下图:
这样配置之后有什么效果呢:QPS起初会从(3/3/=1)每秒通过一次请求开始预热直到5秒之后达到每秒通过3次请求。动态效果图如下:
从上述动画可以清楚的看见:前几秒是频繁流控的,直到5秒,QPS阈值达到了3。
具体算法原理请看:https://github.com/alibaba/Sentinel/wiki/限流---冷启动
排队等待匀速排队方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。源码对应得类:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
注意:这一效果只针对QPS流控,并发线程数流控不支持。
简单举个栗子:你去大学食堂吃饭,只有一个阿姨在打饭,那么所有人都要排队打饭,每次只有一个人打到饭,其他人都在排队等待。
不同的是sentinel有个超时等待时间,一旦超过这个预定设置的时间将会被限流。
该方式作用如下图:
这种方式适合用于请求以突刺状来到,这个时候我们不希望一下子把所有的请求都通过,这样可能会把系统压垮;同时我们也期待系统以稳定的速度,逐步处理这些请求,以起到“削峰填谷”的效果,而不是拒绝所有请求。
比如设置QPS阈值为1,超时等待时间为10000毫秒,如下图:
此时的效果如下:
从上图可以看到:连续点击刷新请求,虽然设置了QPS阈值为1,但是并没有被限流,而是在等待,因为设置了超时等待时间为10秒。
具体算法原理请看:https://github.com/alibaba/Sentinel/wiki/流量控制-匀速排队模式
2、三种流控模式流控模式总共分为三种,对应元素strategy,分别如下:
直接拒绝:接口达到限流条件时,直接限流
关联:当关联的资源达到阈值时,就限流自己
链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就可以限流)
下面来详细介绍下以上三种流控模式。
直接拒绝