Sentinel流控规则详解

Sentinel的主要工作之一就是流量控制,因此对流控规则的掌握是必不可少的。

Sentinel名词解释

  • 资源名:唯一名称,默认请求路径
  • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,指定对哪个微服务进行限流 ,默认default(不区分来源,全部限制)
  • 阈值类型/单机阈值:
    1、QPS(每秒钟的请求数量):当调用该接口的QPS达到了阈值的时候,进行限流;
    2、线程数:当调用该接口的线程数达到阈值时,进行限流
  • 是否集群:不需要集群
  • 流控模式:
    1、直接:接口达到限流条件时,直接限流
    2、关联:当关联的资源达到阈值时,就限流自己
    3、链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就可以限流)[api级别的针对来源]
  • 流控效果
    1、快速失败:直接失败
    2、Warm Up:即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值
    3、排队等待

阈值类型讲解

在这里插入图片描述
单机阈值比较好理解,就是每秒对QPS/线程数的控制。
QPS与线程数的区别在于:

  • QPS单纯的代表每秒的访问次数,只要访问次数到达一定的阈值,这进行限流操作
  • 线程数,代表的是每秒内访问改api接口的线程数,如果该接口的操作比较长,当排队的线程数到达阈值的时候,进行限流操作,相反的如果接口的操作很快,即是没秒内的操作很快,同样不会进行限流操作
  • QPS可以简单的理解为访问次数,但是线程数是和接口处理的快慢有关的。

流控模式

流控模式分为直接、关联和链路
直接模式理解起来比较简单,就是单纯的对当前资源的流量控制,这里不再做过多的解释。

关联模式

定义:当关联的资源达到阈值时,限流自己。
如下图的配置,当A的QPS的阈值到达2的时候,B就会被限流。
在这里插入图片描述

链路模式

在这里插入图片描述
源码如下:
定义SentinelResource 为getOrder

import java.util.Random;

@Service
public class OrderServiceImpl implements OrderService{

    @Override
    @SentinelResource(value = "getOrder", blockHandler = "handleException")
    public String  getOrder() {
        return String.valueOf(new Random().nextInt());
    }

    public String handleException(BlockException ex) {
        System.out.println("县六中............");
        return  ex.getClass().getCanonicalName() + "\t服务不可用";
    }
}

定义两个请求接口,调用getOrder()

    @Resource
    private OrderService orderService;

    @GetMapping("/test1")
    public String test1() {
        return orderService.getOrder();
    }

    @GetMapping("/test2")
    public String test2() {
        return orderService.getOrder();
    }

实际效果,应该是对配置链路的test1进行限流控制,实现更加细致化的流控,但是实际并没有什么效果。

流控效果

流控效果分为直接失败、预热和排队等待。
直接失败理解起来比较简单,就是限流的时候直接提示。

预热模式

在这里插入图片描述
根据codeFactor(冷加载因子,默认为3)的值,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值 ,因此上图的配置就是系统初始化的默认阈值为10 / 3,即为3,也就是刚开始的时候阈值只有3,当经过5s后,阈值才慢慢提高到10;这种情况主要是为了保护系统,例如在秒杀系统的开启瞬间,会有很多流量上来,很可能会把系统打挂,预热方式就是为了保护系统,可以慢慢的把流量放进来,慢慢的把阈值增长到设定值。

排队等待模式

在这里插入图片描述
/test2每秒5次请求,超过的话就排队等待,等待的超时事件为10ms,目的是为了匀速处理请求,保证服务的均匀性,而不是一会处理大量的请求,一会有没有请求可处理。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐