草庐IT

Sentinel 限流原理

Heloise_yangyuchang 2023-06-16 原文

Sentinel 限流原理

一、限流规则

在Sentinel中,限流的直接表现形式是,在执行Entry nodeA =SphU.entry(resourceName) 的时候抛出 FlowException 异常。FlowException 是BlockException 的子类,可以捕捉 BlockException 来自定义被限流之后的处理逻辑。

并且,对于同一个资源或者不同资源可以分别创建多条限流规则,FlowSlot会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。

限流规则主要由下面几个因素组成:

  • resource:资源名,即限流规则的作用对象
  • count : 限流阈值
  • grade : 限流阈值类型(QPS 或并发线程数)
  • limitApp : 流控针对的调用来源,若为 default 则不区分调用来源
  • strategy : 限流策略(基于调用关系的流量控制)
  • controlBehavior : 流量控制效果(直接拒绝、Warm Up、匀速排队)

Sentinel中提供了两个限流纬度:

  1. 并发线程数
  2. QPS

也就是说,可以选择根据不同的纬度,根据这些纬度的指标去匹配限流规则,一旦达到阈值,则直接触发流量控制。
默认情况下是根据QPS来限流的,这个属性是通过grade进行设置。

二、并发线程数控制

并发数控制用于保护业务线程池不被慢调用耗尽。当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗尽。

为了应对太多线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(Hystrix 线程池隔离)。
这种隔离方案虽然隔离性比较好,但是代价就是线程数目太多,线程上下文切换的 (开销)比较大,特别是对低延时的调用有比较大的影响。

Sentinel 并发控制不负责创建和管理线程池,而是简单统计当前请求上下文的线程数目(正在执行的调用数目),如果超出阈值,新的请求会被立即拒绝,效果类似于Hystrix 信号量隔离

并发线程数控制参数配置(并发线程数控制通常在调用端进行配置):

  1. grade: RuleConstant.FLOW_GRADE_THREAD
  2. count: 此时它的含义是并发线程数量

三、QPS流量控制

当 QPS 超过某个阈值的时候,则采取措施进行流量控制行为(类似于我们前面说过的限流算法上的差异)。
Sentinel提供了四种流量控制行为

  1. 直接拒绝(CONTROL_BEHAVIOR_DEFAULT)
  2. Warm Up(CONTROL_BEHAVIOR_WARM_UP)
  3. 匀速排队(CONTROL_BEHAVIOR_RATE_LIMITER,漏桶算法 )
  4. 冷启动+匀速器(CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER),除了让流量缓慢增
    加,还还控制的了请求的间隔时间,让请求均匀速度通过。

这四个行为,是通过FlowRule中的controlBehavior属性来控制,默认是直接拒绝。

3.1、直接拒绝

是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException
这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。

3.2、Warm Up

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

属性设置:
controlBehavior: RuleConstant.CONTROL_BEHAVIOR_WARM_UP
warmUpPeriodSec:预热时间,默认60s。


3.3、匀速排队

会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,其实对应的是漏桶算法。当请求数量远远大于阈值时,这些请求会排队等待,这个等待时间可以设置,如果超过等待时间,那这个请求会被拒绝。这种方式主要用于处理间隔性突发的流量,例如消息队列。

属性设置:

controlBehavior:RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER
maxQueueingTimeMs:排队等待时间,表示每一次请求最长等待时间,默认是500ms

四、基于调用关系的流量控制

在分布式架构中,一个请求会包含调用方和被调用方,Sentinel还提供了服务调用关系的流量控制策略,所谓的调用关系,就是根据不同的调用纬度来触发流量控制。

  1. 根据调用方限流(STRATEGY_DIRECT)
  2. 根据调用链路入口限流(STRATEGY_CHAIN)
  3. 具有关系的资源流量控制(STRATEGY_RELATE)

4.1、根据调用方限流

比如有两个服务分别是A和B,都向某一个服务C发起请求调用,这个时候我们希望对来自服务B的请求进行限流,那就可以采用调用方限流策略,

属性设置:
strategy:STRATEGY_DIRECT
LimitApp:

  • default,表示不区分调用者。
  • ${some_origin_name},针对特定的调用者。
  • other,表示针对除了${some_origin_name}以外的其他调用方的流量进行流量控制。

4.2、根据调用链路入口限流

一个被限流的保护方法,可能来自于不同的调用链路,比如针对资源NodeA,入口Entrance1 和 Entrance2 的请求都调用到了资源 NodeA,Sentinel 允许只根据某个入口的统计信息对资源限流。

属性设置:
strategy:STRATEGY_CHAIN
refResource:Entrance1,表示只有从入口Entrance1的调用才会进行流量控制

4.3、具有关系的资源流量控制

当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。

属性设置:
strategy:=STRATEGY_RELATE
refResource:write_db,表示设置关联资源

通过这样的设置后,如果write_db资源超过阈值时,就会对read_db资源进行限流。

总结:

Sentinel 限流 ,本质上都是当前系统所关注的资源保护指标,最终意义是保护系统,让系统平稳运行!

有关Sentinel 限流原理的更多相关文章

  1. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

  2. Slowloris DoS攻击的原理与简单实现 - 2

    前言    Slowloris攻击是我在李华峰老师的书——《MetasploitWeb 渗透测试实战》里面看的,感觉既简单又使用,现在这种攻击是很容易被防护的啦。不过我也不敢真刀实战的去试,只是拿个靶机玩玩罢了。         废话还是写在结语里面吧。(划掉)结语可以不看(划掉)Slowloris攻击的原理        Slowloris是一种资源消耗类DoS攻击,它利用部分HTTP请求进行操作。也叫做慢速攻击,这里的慢速并不是说发动攻击慢,而是访问一条链接的速度慢。Slowloris攻击的功能是打开与目标Web服务器的连接,然后尽可能长时间的保持这些连接打开。如果由多台电脑同时发起Slo

  3. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

  4. ruby - # Ruby 中识别方法约定的基本原理/历史是什么? - 2

    例如,我一直看到称为String#split的方法,但从未见过String.split,这似乎更合乎逻辑。或者甚至可能是String::split,因为您可以认为#split位于String的命名空间中。当假定/隐含类(#split)时,我什至单独看到了该方法。我知道这是ri中识别方法的方式。哪个先出现?例如,这是为了区分方法和字段吗?我还听说这有助于区分实例方法和类方法。但这从哪里开始呢? 最佳答案 不同之处在于您如何访问这些方法。类方法使用::分隔符来表示消息可以发送到类/模块对象,而实例方法使用#分隔符表示消息可以发送到实例对

  5. H264压缩原理 - 2

    1、为什么压缩的原始数据一般采用YUV格式(1)利用人对图片感觉的生理特性,对于亮度信息比较敏感,对于色度信息不太敏感,所以视频编码是将Y分量和UV分量分开来编码,并且可以减少UV分量.2、视频压缩原理(1)空间冗余:图像相邻像素之间的相关性,比如一帧图片被划分成多个16x16的块之后,相邻的块之间有很多明显的相似性。(2)时间冗余:时间相差较近的两张图片变化较小。(3)视觉冗余:我们的眼睛对某些细节不太敏感,对图像中的高频信息的敏感度小于低频信息,可以去除一些高频信息。(4)编码冗余:一幅图片中不同像素出现的概率是不同的,对于出现次数较多的像素,用少的位数来编码,对于出现次数较少的像素,用多

  6. Python——程序的运行原理 - 2

    Python程序运行原理Python是一种脚本语言,编辑完成的程序,也称源代码,可以直接运行。从计算机的角度看,Python程序的运行过程包含两个步骤:解释器将源代码翻译成字节码(即中间码),然后由虚拟机解释执行。Python程序文件的扩展名通常为.py。在执行时,首先由Python解释器将.py文件中的源代码翻译成中间码,这个中间码是一个扩展名为.pyc的文件,再由Python虚拟机(PythonVirtualMachine,PVM)逐条将中间码翻译成机器指令执行。需要说明的是,pyc文件保存在Python安装目录的pycache文件夹下,如果Python无法在用户的计算机上写人字节码,字节

  7. mysql - Rails 数据库连接池的工作原理 - 2

    我正在学习Rails数据库连接池概念。在Rails应用程序中,我将池大小定义为5。我对连接池大小的理解如下。当服务器启动时,rails会自动创建n个在database.yml文件中定义的连接。在我的例子中,它将创建5个连接,因为池大小为5。在每个http请求上,如果需要访问数据库,rails将使用连接池中的可用连接来处理请求。但我的问题是,如果我一次达到1000个请求,那么大部分请求将无法访问数据库连接,因为我的连接池大小只有5个。我上面对rails连接池的理解对吗??谢谢, 最佳答案 目的:数据库连接不是线程安全的;所以Activ

  8. ElasticSearch——刷盘原理流程 - 2

    ElasticSearch——刷盘原理流程刷盘原理流程名词和操作解释相关设置刷盘原理流程整个过程会分成几步:数据会同时写入buffer缓冲区和translog日志文件buffer缓冲区满了或者到时间了(默认1s),就会将其中的数据转换成新的segment并写入系统文件缓存,这一步叫refresh其中后台会自动合并小的segment成大的segment;这一步叫段合并当translog达到大小的阈值(默认512M)或者flush默认时长(30m),则会执行flush操作:内存中数据写入新的segment放入缓存(清空内存区)一个commitpoint写入磁盘,表示哪些segment已写入磁盘将缓

  9. ruby-on-rails - 了解 establish_connection 在 ActiveRecord 中的工作原理 - 2

    此代码取自ActiveRecord2.3.14的gem类ConnectionHandlerdefestablish_connection(name,spec)@connection_pools[name]=ConnectionAdapters::ConnectionPool.new(spec)end似乎每次ruby​​在模型上调用establish_connection时,它都会创建一个新的连接池。我的问题:如果我有5个模型使用establish_connection连接到同一个数据库,Rails是否足够智能以选择一个已经存在的池而不是创建一个具有相同连接凭据的新池?如果我的5个模型是

  10. 51单片机(郭天祥版)——键盘检测原理及应用实现 - 2

    实验中我们使用的是52单片机目录前言一、单片机是什么?二、实验步骤1.独立键盘检测1.2代码如下(示例):1.3图片1.4视频2.矩阵键盘检测2.2代码如下(示例):2.3图片2.4视频总结:以上就是今天要讲的内容,本文仅仅简单介绍了单片机键盘检测的应用实现,而单片机键盘检测相关理论可以参考教材进行学习前言文章内主要概念引自郭天祥老师《新概念51单片机C语言版》一书主要展示郭天祥老师书中第四章键盘检测原理及应用实现。分为仿真、实体两部分。一、单片机是什么?单片机就是在一块硅片上集成了微处理器、存储器及各种输入/输出接口的芯片,这样一块芯片就具有了计算机的属性,因而被成为单片微型计算机,简称单片

随机推荐