概览
流控规则
sentinel流控规则
资源名-resource
资源名,即限流规则的作用对象。
默认为RESTful请求的url地址
, 也可以通过@SentinelResource指定
。
针对来源-limitApp
-
default
:表示不区分调用者,来自任何调用者的请求都将进行限流统计。 -
{some_origin_name}
:表示针对特定的调用者,只有来自这个调用者的请求才会进行流量控制。 -
other
:表示针对除{some_origin_name}
以外的其余调用方的流量进行流量控制。例如,
资源
NodeA
配置了一条针对调用者caller1
的限流规则,同时又配置了一条调用者为
other
的规则,那么任意来自非
caller1
对NodeA
的调用,都不能超过other
这条规则定义的阈值。
同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default
阈值类型
-
并发线程数流量控制(RuleConstant.FLOW_GRADE_THREAD = 0)
:线程数限流用于保护业务线程数不被耗尽。例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗尽。为应对高线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(线程池隔离),或者使用信号量来控制同时请求的个数(信号量隔离)。这种隔离方案虽然能够控制线程数量,但无法控制请求排队时间。当请求过多时排队也是无益的,直接拒绝能够迅速降低系统压力。
Sentinel线程数限流不负责创建和管理线程池,而是简单统计
当前请求上下文的线程个数,如果超出阈值,新的请求会被立即拒绝。
-
QPS流量控制(RuleConstant.FLOW_GRADE_QPS = 1)
: 当 QPS 超过某个阈值的时候,则采取措施进行流量控制。 -
单机阈值count
流控模式-strategy
-
直接(
RuleConstant.STRATEGY_DIRECT = 0
): 默认,根据调用方限流。 -
关联(
RuleConstant.STRATEGY_RELATE = 1
): 当两个资源之间具有资源争抢或者依赖关系
的时候,这两个资源便具有了关联。比如
订单/order
接口处理会依赖支付/pay
,当支付接口卡单时,需要限制订单接口的流量。 -
链路(
RuleConstant.STRATEGY_CHAIN = 2
): 只统计某些入口的流量。NodeSelectorSlot
中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。machine-root / \ / \ Entrance1 Entrance2 / \ / \ DefaultNode(nodeA) DefaultNode(nodeA)
通过如下配置,只统计
Entrance1
流入到nodeA
的流量。
流控效果-controlBehavior
流控效果,必须在阈值类型设置为QPS
时有效,否则无效。
-
直接拒绝(
RuleConstant.CONTROL_BEHAVIOR_DEFAULT = 0
) -
预热(
RuleConstant.CONTROL_BEHAVIOR_WARM_UP = 1
): 即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加至阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。公式: 冷加载因子(
codeFactor 默认值为3
),请求阈值从count/3
开始,经过预热时长
主键升到设定的QPS阈值如,秒杀系统,刚开始时大批量的请求过来,会将系统挤垮,通过预热时长后,才慢慢提升到设定的QPS.
-
匀速器(
RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER =2
): 严格控制请求通过的间隔时间漏斗算法,这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
熔断降级
降级策略
-
平均响应时间 (
DEGRADE_GRADE_RT
):当资源的平均响应时间超过阈值之后,资源进入准降级状态
。接下来如果持续进入5个请求
,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(之内,对这个方法的调用都会自动地返回(抛出DegradeException
),即熔断。-
超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项
-Dcsp.sentinel.statistic.max.rt=xxx
来配置。 -
sentinel
断路器没有
半开状态`,只有在时间窗口期结束后,关闭降级。
-
-
异常比例 (
DEGRADE_GRADE_EXCEPTION_RATIO
):当资源的每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态。- 异常比率的阈值范围是
[0.0, 1.0]
,代表 0% - 100%。
- 异常比率的阈值范围是
-
异常数 (
DEGRADE_GRADE_EXCEPTION_COUNT
):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。
热点规则
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制.
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数
的资源调用生效。
测试代码
@RequestMapping("/testHotKey")
@SentinelResource(value = "testHotKey" ,blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(required = false) String p1,@RequestParam(required = false) String p2) {
return "---- testHotKey";
}
public String deal_testHotKey(String p1, String p2, BlockException blockException) {
return "deal_testHotKey";
}
配置
系统规则
系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 和线程数四个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN
),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。
- Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的
maxQps * minRt
计算得出。设定参考值一般是CPU cores * 2.5
。 - CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0)。
- RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
- 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。
授权规则
很多时候,我们需要根据调用方
来限制资源是否通过,这时候可以使用 Sentinel 的黑白名单控制的功能。黑白名单根据资源的请求来源(origin
)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
集群流量控制
为什么要使用集群流控呢?假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50,但机器数可能很多(比如有 100 台)。这时候我们很自然地就想到,找一个 server 来专门来统计总的调用量,其它的实例都与这台 server 通信来判断是否可以调用。这就是最基础的集群流控的方式。