当 QPS 超过某个阈值的时候,则采取措施进行流量控制。流量控制的效果包括以下几种:直接拒绝、Warm Up、匀速排队/排队等待。对应 FlowRule 中的 controlBehavior 字段。

注意:若使用除了直接拒绝之外的流量控制效果,则调用关系限流策略(strategy)会被忽略。

官网地址:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6

【1】直接拒绝

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

这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。

SpringCloud Alibaba Sentinel 流量控制之流控效果实践总结_流量控制

浏览器频繁访问 :http://localhost:8401/testA ,将会抛出异常信息Blocked by Sentinel (flow limiting)。

SpringCloud Alibaba Sentinel 流量控制之流控效果实践总结_sentinel_02

对应源码实现为:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController

【2】Warm Up

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。

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

通常冷启动的过程系统允许通过的 QPS 曲线如下图所示:

SpringCloud Alibaba Sentinel 流量控制之流控效果实践总结_spring cloud_03

具体来说为:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值。

默认coldFactor为3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。如下为例,刚开始限制QPS为10/3=3,经过5秒后,QPS限制为设置的阈值10 。

SpringCloud Alibaba Sentinel 流量控制之流控效果实践总结_sentinel_04

源码实现:com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController

应用场景如:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阀值增长到设置的阀值。

【3】匀速排队

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。

该方式的作用如下图所示:

SpringCloud Alibaba Sentinel 流量控制之流控效果实践总结_流量控制_05

这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

注意:匀速排队模式暂时不支持 QPS > 1000 的场景。

如下我们设置规则,期望每秒处理一个请求。

SpringCloud Alibaba Sentinel 流量控制之流控效果实践总结_源码实现_06

频繁请求 http://localhost:8401/testA,如下图所示每秒处理一个请求,后面的请求需要等待:

SpringCloud Alibaba Sentinel 流量控制之流控效果实践总结_spring cloud_07

其源码实现为:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController