ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

sentinel流控规则

2022-05-21 10:01:36  阅读:200  来源: 互联网

标签:请求 阈值 testA 限流 testB 流控 规则 sentinel QPS


1.名词解释

image

  1. 资源名:唯一名称,默认请求路径

  2. 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)

  3. 阈值类型/单机阈值:

    1. QPS(每秒钟的请求数量):当调用该API的QPS达到阈值的时候,进行限流
    2. 线程数:当调用该API的线程数量达到阈值的时候,进行限流
  4. 是否集群:当前不需要集群

  5. 流控模式:

    1. 直接:API达到限流条件时,直接限流
    2. 关联:当关联的资源达到阈值时,就限流自己
    3. 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)(API级别的针对来源)
  6. 流控效果:

    1. 快速失败:直接失败,抛异常
    2. Wam Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFacotor,经过预热时长,才达到设置的QPS阈值
    3. 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

2.QPS限流

image

单机阈值设定为1,代表的是当前这个接口1秒只能被访问一次,超过这个阈值,就会被Sentinel阻塞,现在默认为直接失败

image

3.并发线程数限流

image

QPS表示每秒最多有多少个请求可以进入到此方法

并发线程数表示同时进入到此方法的线程最多有多少个,比如我现在阈值设置为5,如果此时我的/testA执行需要10秒,那么最多有5个线程可以进入到此方法,超过5个的线程都会被拒接

修改代码:

@RestController
public class FlowLimitController {

 @GetMapping("/testA")
 public String testA() throws InterruptedException {
     System.out.println("进入A方法");
     Thread.sleep(30000); // 休眠30s达到阻塞的效果
     return "-----testA";
 }

 @GetMapping("/testB")
 public String testB() {
     return "-----testB";
 }
}

不断刷新浏览器,当请求超过5个的时候会抛出异常,观察后台打印最多只有5个输出

image

image

4.关联限流

官方解释:当关联的资源达到阈值时,就限流自己。通俗解释来说,比如那我们的程序,现在有testA接口和testB接口,当A关联的资源B达到阈值后,就限流自己,也就是B到达阈值,限流A本身。比如一个电商系统中,支付系统达到阈值,就限流下订单系统。

image

添加流控规则:当关联资源/testB的qps阈值超时1时,就限流/testA的Rest访问地址,当关联资源到阈值后限制配置好的资源名

image

验证结果当testB到达阈值后,限流testA

image

image

5.链路

链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流,它的功能有点类似于针对来源配置项,区别在于:针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。比如在一个微服务中,两个接口都调用了同一个Service中的方法,并且该方法用SentinelResource(用于定义资源)注解标注了,然后对该注解标注的资源(方法)进行配置,则可以选择链路模式。

image

具体演示:

增加一个service类:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

@Service
public class TestService {
 // 定义限流资源
 @SentinelResource("common")
 public String common(){
     return "common";
 }
}

然后更改接口调用这个Service方法:

RestController
public class FlowLimitController {

 @Autowired
 TestService testService;

 @GetMapping("/testA")
 public String testA() throws InterruptedException {
     testService.common();
     return "-----testA" ;
 }

 @GetMapping("/testB")
 public String testB() {
     testService.common();
     return "-----testB";
 }

}

修改yml文件:

spring:
cloud:
 sentinel:
   # 配置为false,不配置链路规则无法生效
   web-context-unify: false

增加链路流控规则:

image

最后频繁访问testB正常方法,频繁访问testA则出现异常

image

6.预热

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

预热公式:阈值/coldFactor(默认值为3),经过预热时间后才会达到阈值。

使用场景:一般秒杀系统中会有这样的流控设置,为了防止秒杀瞬间造成系统崩溃。

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

image

增加预热规则:

image

默认coldFactor为3,当发起请求的时候QPS从(阈值/3)开始,经过多长预热时长才逐步升至设定的QPS阈值,当前阈值设置为10,预热时长设置为5秒。

最终的效果,系统初始化时阈值/3约等于3,即阈值在此时为3,经过5秒后阈值才慢慢升高到10

image

7.排队等待

概念:匀速排队方式会严格控制请求通过的间隔时间,也就是让请求以均匀的速度通过,对应的是漏桶算法。这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求(削峰填谷)。

image

匀速器:它的中心思想是,以固定的间隔时间让请求通过。当请求到来的时候,如果当前请求距离上个请求通过的时间间隔不小于预设值,则让当前请求通过。否则,计算当前请求的预期通过时间,如果该请求的预期通过时间小于规则预设的 timeout 时间,则该请求会等待直到预设时间到来通过(排队等待处理);若预期的通过时间超出最大排队时长,则直接拒接这个请求。

image

Sentinel 匀速排队等待策略是漏桶算法结合虚拟队列等待机制实现的。

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

流控规则配置:

image

image

通过打印时间可以观察到每个请求通过的时候大概都在1s左右,如果排队等待中的请求超过20个,那么后续请求会被拒绝

标签:请求,阈值,testA,限流,testB,流控,规则,sentinel,QPS
来源: https://www.cnblogs.com/ZT-666/p/16294476.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有