【sentinel】流控规则详解

article/2025/8/25 6:14:11

流量控制规则,简称流控规则,会对资源的流量进行限制。同一个资源可以对应多条限流规则。Sentinel会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。

限流的直接表现是抛出FlowException异常。FlowException是BlockException的子类,您可以捕捉BlockException来自定义被限流之后的处理逻辑。

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

FieldLabel说明默认值
resource资源名资源名是限流规则的作用对象
limitApp针对来源
count单机阈值限流阈值
grade阈值类型限流阈值类型,QPS或线程数模式QPS模式
strategy流控模式调用关系限流策略:直接、链路、关联直接
controlBehavior流控效果流控效果:直接拒绝、排队等待、慢启动模式直接拒绝

在这里插入图片描述

阈值类型

流量控制主要有两种统计类型,一种是统计线程数,另外一种则是统计QPS。

类型由FlowRule.grade字段来定义。其中,0代表根据并发数量来限流,1代表根据QPS来进行流量控制。其中线程数、QPS值,都是由StatisticSlot实时统计获取的。

可以通过下面的命令查看实时统计信息:

curl http://localhost:8719/cnode?id=resourceName

例如,注意端口不一定是8719,具体是多少可以通过sentinel控制台->机器列表查看:

curl http://localhost:8720/cnode?id=sentinel-annotationidx id                  thread    pass      blocked   success    total    aRt   1m-pass   1m-block   1m-all   exception  
2   sentinel-annotation 0         1.0       672.0     1.0        673.0    0.0   8         5117       5125     0.0     

其中:

  • thread:代表当前处理该资源的线程数;
  • pass:代表一秒内到来到的请求;
  • blocked:代表一秒内被流量控制的请求数量;
  • success:代表一秒内成功处理完的请求;
  • total:代表到一秒内到来的请求以及被阻止的请求总和;
  • RT:代表一秒内该资源的平均响应时间;
  • 1m-pass:则是一分钟内到来的请求;
  • 1m-block:则是一分钟内被阻止的请求;
  • 1m-all:则是一分钟内到来的请求和被阻止的请求的总和;
  • exception:则是一秒内业务本身异常的总和。

QPS

当QPS超过某个阈值的时候,则采取措施进行流量控制。

线程数

线程数限流用于保护业务线程数不被耗尽。例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗尽。为应对高线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(线程池隔离),或者使用信号量来控制同时请求的个数(信号量隔离)。这种隔离方案虽然能够控制线程数量,但无法控制请求排队时间。当请求过多时排队也是无益的,直接拒绝能够迅速降低系统压力。Sentinel线程数限流不负责创建和管理线程池,而是简单统计当前请求上下文的线程个数,如果超出阈值,新的请求会被立即拒绝。

根据调用关系限流策略

调用关系包括调用方、被调用方;方法又可能会调用其它方法,形成一个调用链路的层次关系。Sentinel通过NodeSelectorSlot建立不同资源间的调用的关系,并且通过ClusterNodeBuilderSlot记录每个资源的实时统计信息。

有了调用链路的统计信息,我们可以衍生出多种流量控制手段。

根据调用方限流

ContextUtil.enter(resourceName, origin)方法中的origin参数标明了调用方身份。这些信息会在ClusterBuilderSlot中被统计。

可通过以下命令来展示不同的调用方对同一个资源的调用数据:

curl http://localhost:8719/origin?id=nodeA

例如,调用数据示例:

curl http://localhost:8720/origin?id=sentinel-annotationid: sentinel-annotationidx originthreadNum passQps   blockQps   totalQps aRt   1m-pass   1m-block   1m-total 
1   nodeA 0         0.0       0.0        0.0      0.0   0         0          0        
2   nodeB 0         0.0       0.0        0.0      0.0   100       0          100   

上面这个命令展示了资源名为sentinel-annotation的资源被两个不同的调用方调用的统计。

可以实现接口RequestOriginParser来获取请求中的某个参数来标明调用方身份,例如可以从请求的Header中获取source字段来标明调用方身份,然后可以将source字段配置在流控规则中,可以根据source的值进行限流:

package com.morris.user.config;import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;@Component
public class HeaderOriginParser implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest request) {/*** 根据header中的source字段来区分请求来源*/return request.getHeader("source");}
}

在sentinel自带的适配器模块sentinel-spring-webmvc-adapter中默认实现了一个请求来源解析器RequestOriginParser,我们可以将InterceptorConfig注入到项目中来使用:

com.alibaba.csp.sentinel.demo.spring.webmvc.config.InterceptorConfig#addSpringMvcInterceptor

private void addSpringMvcInterceptor(InterceptorRegistry registry) {SentinelWebMvcConfig config = new SentinelWebMvcConfig();config.setBlockExceptionHandler(new DefaultBlockExceptionHandler());config.setHttpMethodSpecify(true);config.setWebContextUnify(true);// 请求来源解析器config.setOriginParser(request -> request.getHeader("S-user"));registry.addInterceptor(new SentinelWebInterceptor(config)).addPathPatterns("/**");
}

可以看到默认取的是请求头中的S-user参数来标记请求的调用方来源,所以当请求头部中没有带S-user参数时sentinel上下文中就无法获取来源,所以就会影响授权规则的限流效果。

限流规则中的limitApp字段用于根据调用方进行流量控制。该字段的值有以下三种选项,分别对应不同的场景:

  • default:表示不区分调用者,来自任何调用者的请求都将进行限流统计。如果这个资源名的调用总和超过了这条规则定义的阈值,则触发限流。
  • {some_origin_name}:表示针对特定的调用者,只有来自这个调用者的请求才会进行流量控制。例如NodeA配置了一条针对调用者caller1的规则,那么当且仅当来自caller1对NodeA的请求才会触发流量控制。
  • other:表示针对除{some_origin_name}以外的其余调用方的流量进行流量控制。例如,资源NodeA配置了一条针对调用者caller1的限流规则,同时又配置了一条调用者为other的规则,那么任意来自非caller1对NodeA的调用,都不能超过other这条规则定义的阈值。

同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default

由于需要为每个调用来源origin的资源建立统计信息StatisticNode,大量使用会造成内存占用过多。这点官方faq中也给出了警示,注意origin数量不能太多,否则会导致内存暴涨,并且目前不支持模式匹配。

例如下面的规则,针对调用方为NodeB的请求进行限流,也就是对请求头中带有source=NodeB的请求进行限流,而不带source请求头或者请求头中source的值不为NodeB的请求不会触发限流。

在这里插入图片描述

根据调用链路入口限流:链路限流

NodeSelectorSlot中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。这棵树的根节点是一个名字为machine-root的虚拟节点,调用链的入口都是这个虚节点的子节点。

一棵典型的调用树如下图所示:

     	          machine-root/       \/         \chainA     chainB/              \/                \chain              chain

上图中来自入口chainAchainB的请求都调用到了资源chain,Sentinel允许只根据某个入口的统计信息对资源限流。比如我们可以设置 FlowRule.strategy为RuleConstant.CHAIN,同时设置FlowRule.ref_identity为chainA来表示只有从入口chainA的调用才会记录到chain的限流统计当中,而对来自chainB的调用漠不关心。

举个例子:chainA、chainB两个接口都调用某一资源chain,chainA->chain、chainB->chain可以看成两个简单的链路,此时可以针对chain配置链路限流,比如限制chainA调用chain,而chainB调用chain则不受影响,它的功能有点类似于针对来源配置项,而链路流控是针对上级接口,它的粒度更细。

示例代码如下:

@RequestMapping("sentinel")
@RestController
public class FlowChainController {@Resourceprivate FlowChainService flowChainService;@RequestMapping("/chainA")public String chainA(Integer num) {return flowChainService.chain(num);}@RequestMapping("/chainB")public String chainB(Integer num) {return flowChainService.chain(num);}
}@Service
public class FlowChainService {@SentinelResource(value = "chain",fallback = "fallback", fallbackClass = ExceptionUtil.class,blockHandler = "blockHandler", blockHandlerClass = ExceptionUtil.class)public String chain(Integer num) {return String.valueOf(10 / num);}
}

规则的配置如下:

在这里插入图片描述

这样当/sentinel/chainA的QPS大于1时,/sentinel/chainA就会触发限流,而/sentinel/chainB不会影响。

注意默认调用链路是收敛的,需要打开才可以进行链路流控:

      web-context-unify: false # 默认将调用链路收敛,需要打开才可以进行链路流控

调用链的入口是通过API方法ContextUtil.enter(name)定义的。

具有关系的资源流量控制:关联流量控制

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

举例来说,read和write这两个资源分别代表数据库读写,我们可以给read设置限流规则来达到写优先的目的:设置FlowRule.strategy为RuleConstant.RELATE同时设置FlowRule.ref_identity为write。这样当写库操作过于频繁时,读数据的请求会被限流。

@RequestMapping("sentinel")
@RestController
public class FlowRelateController {@RequestMapping("/read")public String read(Integer num) {return String.valueOf(10 / num);}@RequestMapping("/write")public String write(Integer num) {return String.valueOf(10 / num);}
}

规则配置如下:

在这里插入图片描述

这样当/sentinel/write的QPS大于1时,/sentinel/read就会触发限流。

流控效果

流控效果只用于根据QPS限流。

流量控制的手段包括下面3种,对应FlowRule中的controlBehavior字段:

  • 直接拒绝(快速失败)(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式
  • WARM_UP(冷启动)(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式
  • 排队等待(匀速器)(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式

快速失败

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

Warm Up

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

当流量突然增大的时候,我们常常会希望系统从空闲状态到繁忙状态的切换的时间长一些。即如果系统在此之前长期处于空闲的状态,我们希望处理请求的数量是缓缓的增多,经过预期的时间以后,到达系统处理请求个数的最大值。Warm Up(冷启动,预热)模式就是为了实现这个目的的。

这个场景主要用于启动需要额外开销的场景,例如建立数据库连接等。

流控的原理是在流量入口处控制流量,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,以便系统可以预热。最适合突发流量的场景。

冷启动,参考了Guava的算法,通过随时调整斜率,把流量在指定的时间之类缓慢调整到特定的阈值。

举个例子:对/sentinel/annotation资源设置直接限流,阈值为10,预热时长为10s,则刚访问此接口时,实际限流阈值为10/3,即为3,也就是刚开始的时候阈值只有3,当经过10s后,阈值才慢慢提高到10。

具体配置如下:

在这里插入图片描述

可以看到流量的增长趋势如下图所示:

在这里插入图片描述

排队等待

这种方式严格控制了请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。

该方式的作用如下图所示:

在这里插入图片描述

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

请求流量具有波峰波谷的特点,流控的原理是将前面的峰值流量延迟(排队时长)到后面再处理,既能最大化满足所有请求,又能保证用户体验。

让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待;它还会让设置一个超时时间,当请求超过超时间时间还未处理,则会被丢弃。

测试案例:对/sentinel/annotation资源进行直接限流,设置阈值为10,设置流控效果为排队等候,等待超时时间设置为1000ms。当每秒10次请求时,再有请求就排队等候,等待超时时间为1000ms, 超时过后,请求将被踢出排队队列,返回限流异常。

在这里插入图片描述

可以看到流量的增长趋势如下图所示:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/4DCAtBo7.shtml

相关文章

Sentinel流控规则

Sentinel流控规则 1、基本介绍 资源名:唯一名称,默认请求路径(如:http://localhost:8089/testA) 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,指定对哪个微服务进行限流 ,默认defa…

流控方案

不同的场景下所需的流控算法不尽相同,那应该如何选择适用的流控方案呢?本文分享单机及分布式流控场景下,简单窗口、滑动窗口、漏桶、令牌桶、滑动日志等几种流控算法的思路和代码实现,并总结了各自的复杂度和适用场景。较长&#…

流控机制的解析

流控是以太网的一项基本功能,可以防止在端口拥塞的情况下出现丢帧。在深入分析之前,先看一个简单的应用场景: 端口A和B接收报文,端口C向外转发报文。如果端口A和B的收包速率之和大于端口C的带宽,那么部分报文就会缓存在…

Sentinel 三种流控效果

文章目录 流控效果1.快速失败2.warm up1)配置流控规则:2)Jmeter测试 3.排队等待1)添加流控规则2)Jmeter测试 .总结 流控效果 我们先来回顾一下流控模式有哪些: 流控模式说明直接统计当前资源的请求&#…

Sentinel流控规则之流控模式介绍

目录 1.直接模式 2.关联模式 3.链路模式 4.流控模式总结 参考: Sentinel限流规则-流控模式之链路模式【图文】_mb5fd869d1d8388_51CTO博客 SpringCloud Alibaba之Sentinel流控管理 - 知乎 (zhihu.com) Sentinel-流控模式之关联模式【图文】_mb5fdcae58218c5_…

串口使用系列学习之什么是流控

概念 在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况。  如台式机与单片机之间的通讯,接收端数据缓冲区已满,则…

串口流控(CTS/RTS)使用详解

1.流控概念 在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况。 如台式机与单片机之间的通讯,接收端数据缓冲区已满&#xff0…

数据治理--浅谈数据标准、元数据、主数据、数据模型

数据标准 数据标准:保障数据的内外部使用和交换的一致性、准确性的规范性约束(如命名、类型、值域等),通常包括了基础指标和计算指标 计算指标:即计算口径,如下单转化率、获客成本、复购率的具体计算的方式 如怎么定义一个人的性别、婚姻状况、健康状况,在不同的业务系…

什么是主数据?什么是主数据管理系统?

什么是主数据?什么是主数据管理系统? 什么是主数据? 企业主数据(Master Data)是用来描述企业核心业务实体的数据,比如客户、合作伙伴、员工、产品、物料单、账户等;它是具有高业务价值的、可以在…

客户主数据

1、KNA1(客户主文件的一般数据) 2、KNB1(客户主数据 (公司代码)) 3、KNVV(客户主记录销售数据) 4、KNVP(客户主记录伙伴功能) 5、KNVK(客户主要联系伙伴) 6、KNAS(客户主数据(一般地区的增值税登记号)) 7、KNB5(客户主记录 (催款数据)) …

企业的主数据建设方法论与实践 | 推荐收藏

本篇文章为亿信华辰《企业的主数据建设方法论与实践》视频直播稿件。 这次我的主题是企业的主数据建设方法论与实践,相信大家来听这场直播,都是对主数据建设比较感兴趣的,同时我也希望能够通过这样一场分享,给大家在主数据的建设…

BP 供应商主数据

BP 供应商S4 和ECC的区别: BP master 这个在SAP ECC6.0之前,SAP对供应商主数据,客户主数据是单独管理的,到了S4 HANA版本,所有的客户主数据和供应商主数据都叫BP 主数据, 通过不同的BP Role 来区分是供应商…

什么是主数据?有什么作用?

什么是主数据?有什么作用? 在说主数据之前,我们先来看一个场景再来看一个行业趋势到底什么是主数据?为什么说主数据管理是一切工作的起点?为了应对这些问题,我们需要引进主数据管理(MDM&#xf…

数据治理【主数据管理】

目录 1.摸家底 1.1 数据资源普查 1.2 主数据识别 1.3 数据管理能力评估 2.建体系 2.1 组织体系 2.2 标准体系 2.3 制度与流程体系 2.4 技术体系 2.5 安全体系 3.接数据 4.抓运营 4.1 主数据管理 4.2 主数据推广 4.3 主数据质量 4.4 主数据变现 我们知道主数据项目的建设是一个循…

主数据建设思路分享

J企主数据方案分享 (一):主数据现状、问题分析及客户诉求 J企的主数据实施业务方案已经签署,主数据平台开发方案也基本敲定,接下来推进历史数据规整方案和各业务系统优化方案的制定。 在此与各位同学分享主数据方案…

数据治理系列(三):主数据管理

主数据项目建设从方法上,分为以下四部,简单归结为12个字:“摸家底、建体系、接数据、抓运营”! 一、摸家底 摸家底需要全面调研和了解企业的数据管理现状,以便做出客观切实的数据管理评估! 1、数据资源普查 数据资源普查的方法常用的有两种,一种是自顶向下的梳理和调…

数仓建模—主数据管理

主数据管理 前面我们介绍过元数据管理,其实关于元数据我们称之为数据的数据,或者说是描述数据的数据,其实除了元数据之外,我们还有主数据,也就是元数据的描述对象。 元数据为大数据平台绘制数据地图、统一数据口径、标明数据方位、分析数据关系、管理模型变更及精确到字…

主数据项目交付最佳实践

任何规模的企业都会存在各种各样的数据问题,主数据管理早在十几年前就已经是企业信息化建设中的一部分,由于企业普遍对此缺乏正确的认识、系统个数较少、数据混乱现象不明显等原因,导致主数据管理这一手段并没有被企业真正的重视起来&#xf…

【数据治理】数据元、元数据、主数据、参考数据概述

【数据治理】数据元、元数据、主数据、参考数据概述 数据元 什么是数据元: 《GB/T 19488.1 电子政务数据元第1部分:设计和管理规范》 里是这样定义的: 数据元(Data element):又称数据类型,通…

MDM主数据管理平台开发精要

随着企业业务迅速发展,需要支撑业务运转的信息系统越来越多,各系统之间数据分散、重复,未完全形成业务闭环,数据孤立不能互通,数据统计不一致,企业主数据(组织、人员、项目、客户、供应商、产品…