Spring Cloud Alibaba【流控效果之冷启动、流控效果之排队等待、热点参数限流、线程隔离、熔断降级、熔断降级之异常数 】(七)

 

目录

分布式流量防护_流控效果之冷启动

分布式流量防护_流控效果之排队等待

分布式流量防护_热点参数限流

分布式流量防护_线程隔离

分布式流量防护_熔断降级

分布式流量防护_熔断降级之慢调用

 分布式流量防护_熔断降级之异常比例

 Jemeter压力测试

分布式流量防护_熔断降级之异常数 


分布式流量防护_流控效果之冷启动

warm up也叫预热模式,是应对服务冷启动的一种方案。

案例实战 

需求:给/payment/index这个资源设置限流,最大QPS为10,利用 warm up效果,预热时长为5秒。

 

 Jmeter测试

查看结果树

 

注意: QPS为10.刚刚启动时,大部分请求失败,成功的只有3个,说 明QPS被限定在3,随着时间推移,成功比例越来越高。 

实时效果反馈

1.Sentienl流控效果冷启动主要解决_____问题。

A 针对来源配置项 

B 快速失败

C 服务刚刚启动,一切资源尚未初始化

D 以上都错误

2.Sentienl流控效果冷启动也叫____模式。

A 预热

B 快速失败

C 关联

D 链路

分布式流量防护_流控效果之排队等待

排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。 

工作原理 

例如:QPS阈值为5,意味着每200ms处理一个队列中的请求,超时时间2s,现在有100个请求过来,服务器最多处理 5 个,其他慢慢排队,timeout = 2S,意味着预期等待时长超过2S的请求会被拒绝 并抛出异常。

 

假如不使用排队等待模式,现在有12个请求过来,第1秒同时接收到10个请求,但第2秒只有1个请求,此时QPS的曲线这样的。 

 

如果使用队列模式做流控,所有进入的请求都要排队,以固定的 200ms的间隔执行,QPS会变的很平滑。 

 

注意: 平滑的QPS曲线,对于服务器来说是更友好的。 

应用场景 

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

案例 

需求:给/payment/queue这个资源设置限流,最大QPS为10,利用排队的流控效果,超时时长设置为5s。

Jmeter测试 

QPS为15,已经超过了我们设定的10。如果是之前的快速失败、 warmup模式,超出的请求应该会直接报错。但是我们看看队列模 式的运行结果: 

 

实时效果反馈

1.Sentienl流控效果排队等待主要解决_____问题。

A 匀速流量

B 平稳大流量

C 突发流量

D 以上都是错误 

分布式流量防护_热点参数限流

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈 值。而热点参数限流是分别统计参数值相同的请求,判断是否超过 QPS阈值。 

全局参数限流

例如,一个根据id查询商品的接口:

访问/goods/{id}的请求中,id参数值会有变化,热点参数限流会根据参数值分别统计QPS,统计结果: 

当id=1的请求触发阈值被限流时,id值不为1的请求不受影响。

配置示例:

 

注意: 对hot这个资源的0号参数(第一个参数)做统计,每1秒相同参数值的请求数不能超过5 

热点参数限流 

刚才的配置中,对查询商品这个接口的所有商品一视同仁,QPS都限定为1。而在实际开发中,可能部分商品是热点商品,例如秒杀商品,我们希望这部分商品的QPS限制与其它商品不一样,高一些。 那就需要配置热点参数限流的高级选项了:

注意: 结合上一个配置,这里的含义是对0号的long类型参数限流,每 1秒相同参数的QPS不能超过5,有两个例外: 如果参数值是100,则每1秒允许的QPS为10 如果参数值是101,则每1秒允许的QPS为15 

案例需求 

给/order/findById这个资源添加热点参数限流,规则如下:

默认的热点参数规则是每1秒请求量不超过2

给102这个参数设置例外:每1秒请求量不超过4

给103这个参数设置例外:每1秒请求量不超过10

注意事项: 热点参数限流对默认的SpringMVC资源无效,需要利用 @SentinelResource注解标记资源

@RestController
@RequestMapping("goods")
public class GoodsController {
/**
     * 热点key限流
     * @param id
     * @return
     */
    @GetMapping("findById")
    public String getGoods(String  id){
        return id;
   }
}

 热点参数限流规则

Jmeter测试

 

实时效果反馈

1.Sentienl热点Key限流主要解决_____问题。 

A 匀速流量

B 上游接口限流

C 接口限流

D 分别统计参数值相同的请求

2.Sentienl资源如何配置热点Key限流规则指定具体参数值为102进行限流_____。

A 参数外项配置

B 流控规则

C 熔断规则

D 权限规则 

分布式流量防护_线程隔离

线程隔离(舱壁模式)

1、线程池隔离

2、信号量隔离(Sentinel默认采用) 

注意:

线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果

信号量隔离:不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限 时,禁止新的请求。 

sentinel的线程隔离 

在添加限流规则时,可以选择两种阈值类型:

注意:

QPS:每秒的请求数

线程数:该资源能使用用的Tomcat线程数的最大值。也就是通过限制线程数量,实现线程隔 离(舱壁模式)。 

流控测试 

新建线程组 

我们新建一个线程组,在启动的时候同时发送10个请求,如下所示:

新建HTTP请求 

创建查看结果树

 

实时效果反馈

1.Sentienl技术中如何实现信号量线程隔离____。

A 阈值类型设置QPS

B 阈值类型设置线程数

C 选择热点规则

D 以上都是错误 

分布式流量防护_熔断降级

熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。 

断路器控制熔断和放行是通过状态机来完成的:

状态机包括三个状态:

1、closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则 切换到open状态

2、open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降 级逻辑。Open状态5秒后会进入half-open状态

3、half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。 请求成功:则切换到closed状态 请求失败:则切换到open状态 

熔断降级策略 

慢调用

业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。

异常比例、异常数 

统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。

实时效果反馈

1.Sentienl技术中下列属于熔断降级策略的是____。

A 慢调用

B 异常比例

C 异常数

D 以上都是正确

2.Sentienl技术中熔断降级是解决__问题的。

A 服务单点故障

B 服务高可用性

C 服务响应慢

D 服务雪崩

分布式流量防护_熔断降级之慢调用

平均响应时间当1s内持续进入5个请求,对应时刻的平均响应时间 (秒级)均超过阈值,那么在接下的时间窗口之内,对这个方法的调用都会自动地熔断(抛出DegradeException )。 

新增接口

@GetMapping("/testC")
    public String testC(Integer id){
        if (id = 1){
          try {
            TimeUnit.SECONDS.sleep(1);
       } catch (InterruptedException e) {
            e.printStackTrace();
         }  
       }
        return "------------testC";
   }

新增RT配置

参数: 超过50ms的请求都会被认为是慢请求,当异常比例达到百分之 40,断路器打开(保险丝跳闸)微服务不可用,保险丝跳闸断电了。过5秒钟由断路器又打开状态变为半开状态放一部分请求进来。 

Jemeter压力测试 

创建线程组 

设置HTTP请求路径

 

测试 

-未使用Jemeter情况下测试/testC接口

使用Jemeter情况下测试/testC接口。

 

结果访问失败

 

注意: 后续我停止Jmeter,没有这么大的访问量了,断路器关闭(保险丝恢复),微服务恢复OK。 

 分布式流量防护_熔断降级之异常比例

概述 

当资源每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态。异常比率的阈值范围是 [0.0,1.0]。

新增接口

    /**
     * 测试异常比例
     * RT 平均响应时间
     * @return
     */
    @GetMapping("testD")
    public String  testD(Integer id) {
        if (id == 1){
            throw new RuntimeException("故意抛出异常,触发异常比例熔断。");
       }
        return "testD";
   }

 设置熔断规则

注意: 在5次请求中,只要异常比例超过0.4,也就是有2次以上的异常,就会触发熔断。 

 Jemeter压力测试

创建线程组 

配置HTTP请求 

测试接口 

发送请求localhost:8001/testD?id=2

分布式流量防护_熔断降级之异常数 

概念 

异常数:当资源近1分钟的异常数目超过阈值之后会进行熔断。

新增接口

/*
     * 测试异常数
     */
    @GetMapping("/testF")
    public String testF()
   {
        int age = 10/0;
        return "------testF 测试异常数";
   }

配置异常数规则

注意: 设置异常数5。 

测试 

请求http://localhost:8001/testF,第一次访问绝对报错,因为除数不能为零, 我们看到error窗口

 

但是达到5次报错后,进入熔断后降级。 

猜你喜欢

转载自blog.csdn.net/m0_58719994/article/details/131860217