携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
3. 流控效果
在流控的高级选项中,有一个流控效果的单选
流控效果是指请求达到流控阈值的时候该采取的措施,包括三种:
- 快速失败:达到阈值的时候,新的请求会被立即拒绝并抛出 FlowException 异常。默认的处理方式。
- Warm Up:预热模式,对于超出阈值的请求同样是拒绝并抛出异常。但这种模式的阈值会动态变化。阈值会从一个较少值逐渐增加到最大的阈值。
- 排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长
3.1 Warm Up
-
Warm Up
也叫做预热模式,是应对服务冷启动的一种方案。请求阈值初始值是
threshold / coldFactor,持续指定时常后,逐渐提高到 threshold 值。也就是说它从开始阈值到最大QPS阈值会有一个缓冲阶段,一开始的阈值是最大QPS阈值的1/3,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景。
例如:coldFactor 的默认值是 3,我设置 QPS 的 threshold 为 10,预热时间为 5 秒。那么初始阈值是 10/3,也就是 3。初始阈值由 3 逐渐增长到 10。
-
配置规则
-
使用场景
当系统长期处于低水位的情况下,流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过“冷启动”,可以让通过的流量慢慢增加,在一定时间内流量逐渐增加到阈值上线。“冷启动”给冷系统一个预热时间,避免冷系统被压垮。Warm Up 冷启动主要用于启动需要额外开销的场景,例如建立数据库连接等。
-
案例
-
配置流控规则
-
JMeter 测试
-
测试结果
我们通过实时监控看到 通过QPS 和 拒绝QPS 逐渐有交集,通过率逐渐上升,拒绝率逐渐下降
-
3.2 排队等待
-
排队等待
当请求超过 QPS 阈值时,快速失败和Warm Up会在第一时刻拒绝新的请求并抛出异常。
而排队等待则是让所有请求进入一个队列当中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面的请求执行完成。如果请求的等待时间超过预计等待时长,则会被拒绝。
-
工作原理
例如:QPS = 5,意味着每 200ms 处理一个队列中的请求;timeout = 2000,意味着预计等待时长超过 2000ms 的请求会被拒绝并抛出异常。
什么是预计等待时长
对上述的流控规则对应的资源有 12 个请求,每个请求用时 200ms。
- 第 9 个请求的预计等待时长 = 200 × (9 - 1) = 1600ms
- 第12个请求的预期等待时长 = 200 × (12 - 1) = 2200ms
-
配置规则
-
使用场景
这种方式主要用于处理间隔性突发的流量,例如:消息队列。当某一时刻由大量的请求涌入,而接下来的几秒处于空闲状态,我们希望系统能够在接下来的空闲时间内逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求
-
案例
-
添加流控规则
-
JMeter 测试
-
测试结果
请求的 QPS 为 15。
我们设置的 QPS 是 5,预期等待时长为 2000,就可以计算出最多能够有 10 个请求在队列中。
我们可以通过实时监控的 通过QPS 和 拒绝QPS 的比例是 2:1。
-
3.3 总结
流控效果有哪些?
-
快速失败:QPS超过阈值时,拒绝新的请求
-
warm up: QPS超过阈值时,拒绝新的请求;QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。
-
排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝
4. 热点参数限流
流控效果的限流是根据某个资源的请求数量是否超过 QPS 阈值来决定。而热点参数限流是分辨统计参数值相同的请求,判断是否超过 QPS 阈值。
4.1 全局参数限流
-
全局参数限流
对某资源的指定请求做统计,每个时间段内的相同请求的 QPS 达到阈值就会拒绝并返回异常。
举个例子就是:A资源对每次到达的第0个请求进行统计,这个请求的在 1 秒内的 QPS 不能超过10。
-
配置规则
这个例子中,这个资源的每个 0 号请求的在 1 秒内 QPS 都不能超过 10。
-
案例
例如,一个根据id查询商品的接口:
访问/goods/{id}的请求中,id参数值会有变化,热点参数限流会根据参数值分别统计QPS,统计结果:
当id=1的请求触发阈值被限流时,id值不为1的请求不受影响。
配置示例:
代表的含义是:对hot这个资源的0号参数(第一个参数)做统计,每1秒相同参数值的请求数不能超过5