Sentinel架构篇 - 流量控制

Sentinel是一个流量控制适配器,它可以调整请求以适应系统处理能力。流量控制分为基于线程数和QPS两种统计类型。线程数限流用于防止系统线程耗尽,而QPS限流则根据请求速率进行控制。流量控制策略包括直接拒绝、冷启动、匀速器和冷启动+匀速器,每种都有其适用场景。此外,Sentinel还支持根据调用方、调用关系和链路进行限流,提供灵活的流量控制方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

流量控制

用于调整网络包发送的数据。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个适配器,可以根据需要将随机的请求调整成合适的形状,如下:

在这里插入图片描述

流量控制有两种统计类型 - 统计线程数、统计 QPS。可以通过如下命令查看实时统计信息:

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

输出内容的格式如下:

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

流量规则的定义

实际代码中对应 FlowRule。

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

Field 说明 默认值
resource 资源名称
count 限流阈值
grade 流量控制的指标(0 - 线程数、1 - QPS) 1 (即 QPS)
limitApp 流量控制针对的调用来源 default(不区分调用来源)
strategy 资源的调用关系(0 - 直接、1 - 关联、2 - 链路) 0(即直接)
controlBehavior 流量控制的效果(0 - 直接拒绝、1 - 冷启动、2 - 匀速器、3 - 冷启动 + 匀速器) 0(即直接拒绝)

流量控制的指标

基于并发线程数

简单统计当前请求上下文的线程个数,如果超过阈值,则新的请求会被拒绝。用于保护业务线程数不被耗尽。

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

流量控制效果只有直接拒绝。

[
    {
   
        "resource": "sayHello",
        "limitApp": "default",
        "grade": 0,
        "count": 4,
        "strategy": 0,
        "controlBehavior": 0
    }
]

基于QPS

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

流量控制的效果

直接拒绝

对应 RuleConstant.CONTROL_BEHAVIOR_DEFAULT。该方式是默认的流量控制方式,当 QPS 超过阈值时,直接拒绝新的请求(拒绝方式是抛出 FlowException)。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。

[
    {
   
        "resource": "sayHello",
        "limitApp": "default",
        "grade": 1,
        "count": 4,
        "strategy": 0,
        "controlBehavior": 0
    }
]

冷启动

对应 RuleConstant.CONTROL_BEHAVIOR_WARM_UP。该方式用于系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位,这种情况可能瞬间把系统压垮。冷启动方式让通过的流量缓慢增加,在一定时间内(warmUpPeriodSec 参数控制预热时长,单位秒)逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮的情况。

在这里插入图片描述

[
    {
   
        "resource": "sayHello",
        "limitApp": "default",
        "grade": 1,
        "count": 10,
        "strategy": 0,
        "controlBehavior": 1,
        "warmUpPeriodSec": 3
    }
]

匀速器

对应 RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER。严格控制请求通过的间隔时间,也就是让请求以均匀的速度通过,对应的是漏桶算法。这种方式主要用于处理间隔性突发的流量,比如消息队列。想象一下这种的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

在这里插入图片描述

[
    {
   
        "resource": "sayHello",
        "limitApp": "default",
        "grade": 1,
        "count": 10,
        "strategy": 0,
        "controlBehavior": 2,
        "maxQueueingTimeMs": 500
    }
]

每秒请求数大于 5 时,多余的请求排队等待。如果 500 毫秒内这些请求得不到处理,则请求会被限流导致访问失败。

冷启动+匀速器

对应 RuleConstant.CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER。冷启动加匀速器组合的方式。

[
    {
   
        "resource": "sayHello",
        "limitApp": "default",
        "grade": 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值