一文带你速通Sentinel限流规则(流控)解读

news2025/7/24 8:02:18

目录

前置知识速补

基本介绍

流控模式

直接模式

关联模式 

链路模式

流控效果 

直接失败

Warm Up(预热)

排队等待


前置知识速补

  • QPS每秒查询率(Query Per Second):每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。 (看来是类似于TPS,只是应用于特定场景的吞吐量)
  • 吞吐量(Throughput):吞吐量是指系统在单位时间内处理请求的数量。对于无并发的应用系统而言,吞吐量与响应时间成严格的反比关系,实际上此时吞吐量就是响应时间的倒数。前面已经说过,对于单用户的系统,响应时间(或者系统响应时间和应用延迟时间)可以很好地度量系统的性能,但对于并发系统,通常需要用吞吐量作为性能指标。
  •  资源: 是 Sentinel 中的核心概念之一。最常用的资源是我们代码中的 Java 方法,一段代码,或者一个接口。 

基本介绍

一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:

  • resource:资源名,即限流规则的作用对象
  • count: 限流阈值
  • grade: 限流阈值类型,QPS 或线程数
  • strategy: 根据调用关系选择策略
  • controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
Field说明默认值
resource资源名,资源名是限流规则的作用对象
count限流阈值
grade限流阈值类型,QPS 或线程数模式

1. QPS:每秒请求数,当前调用该api的QPS到达阈值的时候进行限流

2. 线程数:当调用该api的线程数到达阈值的时候,进行限流

QPS 模式
limitApp流控针对的调用来源default,代表不区分调用来源
strategy调用关系限流策略:直接、链路、关联根据资源本身(直接)
controlBehavior流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流直接拒绝

同一个资源可以同时有多个限流规则。 

 我们可以通过代码定义流量控制规则也可以通过在sentinel控制台进行配置,下面是一个代码配置的方式:

@Service
public class TestService {

 @PostConstruct
    public void init(){
        initFlowRule();
    }

    private static void initFlowRule(){
        //流控规则集合
        List<FlowRule> rules = new ArrayList<>();
        //创建规则
        FlowRule rule = new FlowRule();
        //设置受保护的资源
        rule.setResource("sayHello");
        //设置流控规则 QPS 限流阈值类型:QPS、并发线程数
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 设置受保护的资源的阈值
        rule.setCount(2);
        //设置流控手段:快速失败
        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
        rules.add(rule);
        //加载配置好的规则
        FlowRuleManager.loadRules(rules);
    }

    @SentinelResource(value = "sayHello")
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}

流控模式

在添加限流规则时,点击高级选项,可以选择三种流控模式

  • 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
  • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
  • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

直接模式

直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。

示例:

 其含义是限制 /getInfo这个资源的单机QPS为1,即每秒只允许1次请求,超出的请求会被拦截并报错。

关联模式 

关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流。

调用关系包括调用方、被调用方;一个方法又可能会调用其它方法,形成一个调用链路的层次关系。Sentinel 通过 NodeSelectorSlot 建立不同资源间的调用的关系,并且通过 ClusterBuilderSlot 记录每个资源的实时统计信息。当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。

比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢.

 示例:

当/write资源访问量触发阈值(也就是5时)时,就会对/read资源限流,避免影响/write资源。 

链路模式

链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。

假设现在某公司开发了一个单机的电商系统,为了满足完成“下订单”的业务,程序代码会依次执行订单创建方法->减少库存方法->微信支付方法->短信发送方法。方法像链条一样从前向后依次执行,这种执行的链条被称为调用链路在。

比如某个微服务中 /get接口,会被 /pay接口调用。在另一个业务,List 接口也会被 /shop接口调用。

​但如果按下图配置,将入口资源设为“/pay”,则只会针对 pay接口的调用链路生效。当访问 pay接口的QPS 超过 1 时,get接口就会被限流。而另一条链路从 shop接口到get接口的链路则不会受到任何影响。 

 链路模式与关联模式最大的区别是 /get接口与 /pay接口必须是在同一个调用链路中才会限流,而关联模式是任意两个资源只要设置关联就可以进行限流。

流控效果 

直接失败

快速失败是指流量当过限流阈值后,直接返回响应并抛出 BlockException,快速失败是最常用的处理形式。

Warm Up(预热

阈值一般是一个微服务能承担的最大QPS,但是一个服务刚刚启动时,一切资源尚未初始化(冷启动),如果直接将QPS跑到最大值,可能导致服务瞬间宕机。

warm up也叫预热模式,是应对服务冷启动的一种方案。Warm Up 用于应对瞬时大并发流量冲击。请求阈值初始值是 maxThreshold / coldFactor,持续指定时长后,逐渐提高到maxThreshold值。而coldFactor的默认值是3。

例如:List 接口平时单机阈值 QPS 处于低水位:默认为 1000/3 (冷加载因子)≈333,当瞬时大流量进来,10 秒钟内将 QPS 阈值逐渐拉升至 1000,为系统留出缓冲时间,预防突发性系统崩溃。预热10秒后,慢慢将阈值升至1000。刚开始刷/;List,会出现默认错误,预热时间到了后,阈值增加,没超过阈值刷新,请求正常。

排队等待

当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。

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

Sentinel会以固定的间隔时间让请求通过, 访问资源。当请求到来的时候,如果当前请求距离上个通过的请求通过的时间间隔不小于预设值,则让当前请求通过;否则,计算当前请求的预期通过时间,如果该请求的预期通过时间小于规则预设的 timeout 时间,则该请求会等待直到预设时间到来通过;反之,则马上抛出阻塞异常。

工作原理:

例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout = 2000,意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。

那什么叫做预期等待时长呢?

比如现在一下子来了12 个请求,因为每200ms执行一个请求,那么:

  • 第6个请求的预期等待时长 = 200 * (6 - 1) = 1000ms

  • 第12个请求的预期等待时长 = 200 * (12-1) = 2200ms

也就是第12个请求会被拒绝,其他请求会进入等待队列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于阿基米德优化算法的无人机航迹规划-附代码

基于阿基米德优化算法的无人机航迹规划 文章目录 基于阿基米德优化算法的无人机航迹规划1.阿基米德优化搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用阿基米德优化算法来优化无…

综合实验案例配置

目录 核心交换机与出口路由器的连接 网络出口的配置 策略路由的配置 1.教学楼的流量走电信出口&#xff0c;宿舍楼流量走联通出口&#xff08;基于源&#xff09; 2.访问带内心的服务器走电信出口&#xff0c;访问联通服务器走联通出口 案例图如下&#xff1a; acsw的配置…

二叉树问题——平衡二叉树问题

摘要 本博文主要介绍平衡二叉树问题包括&#xff0c;二叉树的高度差&#xff0c;是否为平衡二叉树&#xff0c;有序链表转二叉搜索树&#xff0c;将二叉搜索树变平衡等。 一、平衡二叉树详解 1.1 判断二叉树是否平衡 /*** Definition for a binary tree node.* public class…

一篇博客读懂顺序表 —— Sequence-List

目录 一、顺序表的初始定义 1.1新建头文件和源文件 1.2 SeqList.h 中的准备工作 二、顺序表的初始化与销毁 三、首尾插入元素 四、首尾删除元素 五、中间插入元素 六、中间删除元素 七、查找指定元素下标 八、源代码 一、顺序表的初始定义 1.1新建头文件和源文件 当我…

zip2john 爆破zip工具

1.使用zip2john工具输出zip文件hash Zip2john 1.zip > 1.txt 2.使用john工具进行zip文件爆破 John 1.txt 如图所示&#xff1a; 该zip密码为19950101

面向Three.js开发者的3D自动纹理化开发包

DreamTexture.js 是面向 three.js 开发者的 3D 模型纹理自动生成与设置开发包&#xff0c;可以为 webGL 应用增加 3D 模型的快速自动纹理化能力。 图一为原始模型, 图二图三为贴图后的模型。提示词&#xff1a; city, Realistic , cinematic , Front view ,Game scene graph 1、…

鸿蒙实现类似于安卓的Handler,鸿蒙的延迟和异步操作

在安卓开发的时候我们想要去延迟处理一些事情可以通过 Handler 解决&#xff0c;比如一秒后处理某些事情&#xff1a; new Handler().postDelayed(new Runnable() {Overridepublic void run() {} },1000);鸿蒙也提供了类似的方法&#xff0c;如下: getUITaskDispatcher().del…

C#,数值计算——积分方程与逆理论Fred2的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public abstract class Fred2 { public readonly double a; public readonly double b; public readonly int n; public double[] t; public double[] f; …

ABBYY16最新pdf文档转换图片、Word、Excel和PPT工具

欢迎来到 ABBYY 软件下载中心&#xff0c;FineReader PDF使专业人员能够最大程度地提高数字工作场所的效率。帮助信息工作者轻松地在同一工作流程中对各种文档进行数字化、检索、编辑、加密、共享和协作。 可以对pdf文档进行各种格式转换&#xff0c;任意转换为图片、Word、Ex…

代码版本控制工具GitLab :从安装到使用一步到位

一、GitLab 是什么&#xff1f; 如果听说过 Git 或者 GitHub&#xff0c;那么 GitLab 你一定也听说过。GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用 Git 作为代码管理工具&#xff0c;并在此基础上搭建起来的 Web 服务。简单理解&#xff1a;GitLab 类似私人版 …

Linux高性能服务器编程——ch12笔记

第12章 高性能I/O框架库Libevent 12.1 I/O框架库概述 基于Reactor模式的I/O框架库包含&#xff1a; 1&#xff09;句柄&#xff1a;与事件源绑定&#xff08;I/O事件、信号和定时事件&#xff09;。当内核检测到就绪事件时&#xff0c;通过句柄来通知应用程序这一事件。I/O事件…

多线程---线程安全的集合类

文章目录 多线程环境使用数组synchronizedListCopyOnWriteArrayList 多线程环境使用队列多线程环境使用哈希表HashTableConcurrentHashMapHashTable VS HashMap VS ConcurrentHashMap 我们原先学习过的集合类&#xff0c;大部分都是线程不安全的。只有Vector、Stack、HashTable…

智能井盖传感器有哪些?万宾科技智能井盖效果

在城市治理过程之中&#xff0c;小小的井盖却成为影响民生的一个重要方面&#xff0c;因为井盖一旦出现问题&#xff0c;会严重影响市民的生命安全&#xff0c;并且传统的井盖一般都会采用人工巡检的方式&#xff0c;这就导致了巡检的难度较大&#xff0c;从而不能对城市各个角…

Hdmi接口与XAPP460

之前写过VGA&#xff0c;其实HDMI也写过&#xff0c;但是没记笔记。 VGA时序 VGA Signal Timing (tinyvga.com) 介绍 规范&#xff1a; 小结&#xff1a; VGA像素编码以后通过差分对端口以十倍像素时钟的速率地串行发送。 官方例程 HDMI编码器 来自xaap460的编码器 // //…

Python Django 之模板继承详解(extends)

文章目录 1 概述1.1 目的1.2 标签&#xff1a;block、extends1.3 目录结构 2 templates 目录2.1 base.html&#xff1a;父页面2.2 login.html&#xff1a;子页面 3 其它代码3.1 settings.py3.2 views.py3.3 urls.py 1 概述 1.1 目的 模板继承 和 类继承 的目的是一样的&#…

机器人仿真-gazebo学习笔记(1)前期准备

1.更新gazebo到gazebo11 1)查看我们的gazebo插件&#xff08;我这里已经是gazebo11了&#xff0c;但对于ubuntu18.04的同学来说应该是gazebo9&#xff09; dpkg -l | grep gazebo 2)卸载gazebo9的插件 sudo apt-get purge gazebo9 gazebo9-common gazebo9-plugin-base libga…

【Java 进阶篇】Java Response 路径详解

在Java Web开发中&#xff0c;处理HTTP响应的路径是一个重要的概念。了解如何正确处理和管理路径对于构建健壮的Web应用程序至关重要。本篇博客将详细介绍Java中的HTTP响应路径&#xff0c;包括路径的组成、相对路径和绝对路径的区别、如何构建和处理路径&#xff0c;以及路径在…

MySQL基础教程下

MySQL 约束 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确、有效性和完整性。 约束描述关键字非空不能为nullnot null唯一约束唯一unique主键非空唯一primary key默认默认值default检查约束满足一个条件chec…

铭控传感数字温度变送器丨远传温度变送器在工业中的助您精准测量

秋季的森林被染成了彩色的&#xff0c;地上满是落叶和一些颗粒饱满的果实。一说起栗子&#xff0c;最令人念念不忘的当属刚出锅的糖炒栗子&#xff0c;栗子的外壳在糖类与高温作用下一点点发生非酶褐变&#xff0c;偶尔有栗子外壳破裂的声音&#xff0c;听着心都跟着颤了一下。…

SIT3088E3.0V~5.5V 供电,ESD 15kV HBM,256 节点,14Mbps 半双工 RS485/RS422 收发器

SIT3088E 是一款 3.0V~5.5V 宽电源供电、总线端口 ESD 保护能力 HBM 达到 15kV 以上、总 线耐压范围达到 15V 、半双工、低功耗&#xff0c;功能完全满足 TIA/EIA-485 标准要求的 RS-485 收发器。 SIT3088E 包括一个驱动器和一个接收器&#xff0c;两者均可独立…