Sentinel的流控规则

Sentinel主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性,它的工作之一就是流量控制,所以我们要对流控规则进行了解与掌握。(这是我对流控规则的学习笔记的整理)

什么是流量控制?

  • 流量控制,它用于调整网络包的发送数据。但是,从系统稳定性角度来说,任意时间到来的请求都是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。
  • 它的原理就是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
  • 流量控制主要有两种统计类型,一种是统计并发线程数,另外一种则是统计 QPS。

Sentinel针对流控的名词解释:

  • 资源名:唯一名称,默认请求路径
  • 针对资源:sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
  • 阈值类型/单机阈值:
  •        QPS(每秒钟的请求数量):当调用该apiQPS达到阈值的时候,进行限流
  •        线程数:当调用该api的线程数达到阈值的时候,进行限流
  • 是否集群:不需要集群
  • 流量模式:
  •       直接:api达到限流条件时,直接限流
  •       关联:当关联资源达到阈值时,就限流自己
  •       链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
  • 流控效果:
  •       快速失败:直接失败,抛出异常
  •       Warm Up(预热): 根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
  •       排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则失效。

Sentinel的流控 

 1.对Sentinel-QPS-直接-快速失败(系统默认Blocked by Sentinel (flow limiting))的尝试:

测试效果:

当我们快速点击访问 http://localhost:8401/testA ,每秒不超过一次,正常访问

 每秒访问超过一次,直接失败进行提示

2.对Sentinel-线程数-直接-快速失败(系统默认Blocked by Sentinel (flow limiting))的尝试: 

测试效果:

根据Sentinel针对流控的名词解释: 线程数:当调用该api的线程数达到阈值的时候,进行限流

我们这里设置阈值为1,为了更方便我们进行观察,对TestA的代码进行修改(在浏览器上面进行访问时,要停留两秒):

    @GetMapping("/testA")
    public String testA(){
        try {
           TimeUnit.MILLISECONDS.sleep(Long.parseLong("2000"));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "-----testA";
    }

用同一个浏览器发送两个请求,其中一个就会直接失败

 3.对Sentinel-QPS-关联-快速失败(系统默认Blocked by Sentinel (flow limiting))的尝试:

测试效果:

这里的意思就是当testB的QPS达到阈值1时,A就会挂掉,进行限流,即现实中当支付接口顶不住时达到阈值,与其相关联的下单接口就不用使用了,对其进行了限流

4. 对Sentinel-QPS-直接-Warm Up(系统默认Blocked by Sentinel (flow limiting))的尝试:

 测试效果:

我对这个案例的理解:对于流控效果Warm up来说,现实中害怕流量明明为0或非常低,突然暴涨到极高的数字,从而可能把系统压垮。通过预热即“冷启动”,将流量缓慢增加,在一定的时间内恢复到设置的QPS阈值,即根据Warm Up预热公式,从(初始化阈值-->缓缓提升到正常的QPS阈值),最开始的初始化阈值是(QPS设置阈值/冷加载因子默认3)

 5.对Sentinel-QPS-直接-排队等待(系统默认为(Blocked by Sentinel (flow limiting))的尝试:

测试效果:

  • 无论有多少的并发请求,我设置了限流的规则是排队等待,就得一个一个处理,其他的在后面排队。
  • 匀速排队,让请求以均匀的速度通过,阀值类型必须设成QPS,否则无效。
  • 设置含义:/TestB每秒1次请求,超过的话就排队等待,等待的超时时间为20000毫秒,目的就是为了匀速处理请求,保证服务的均匀性,而不是一会处理大量的请求,一会有没有请求可处理。

这里修改代码:


    @GetMapping("/testB")
    public String testB(){
        log.info("测试"+Thread.currentThread().getName()+"testB");
        return "-----testB";
    }

 打开Postman

 Sentinel流控规则的结语:

我这里主要展示了流量控制里面基于QPS/并发数的流量控制的QPS流量控制,这里回答一项思考就是当快速失败时展现出来的系统默认Blocked by Sentinel (flow limiting)报错信息,我们的后续处理是有一个fallback的兜底方法。

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值