流控,即流量控制(Flow Control),根据流量、并发线程数、响应时间等指标,把随机到来的流量调整成合适的形状,即流量塑形。避免应用被瞬时的流量高峰冲垮,从而保障应用的高可用性。

项目地址:sentinel流控防护

流量控制有以下几个角度:

运行指标,例如 QPS、并发线程数等。

  • 资源的调用关系,例如资源的调用链路,资源和资源之间的关系,调用来源等。
  • 控制效果,例如直接拒绝、Warm Up(预热)、排队等待等。

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

  • 资源名:即流控规则的作用对象
  • 阈值:流控阈值
  • 阈值类型:流控阈值类型(QPS 或并发线程数)
  • 来源应用:流控规则针对的调用来源,若为 default 则不区分调用来源
  • 流控方式:调用关系限流策略
  • 流控模式:即流控效果,包括快速失败、Warm Up、排队等待模式

运行指标

流量控制支持通过以下运行指标进行流量塑形:

  • 基于 QPS
    QPS 模式根据资源的实时 QPS 进行流量控制。当 QPS 超过指定阈值时采取相应的控制策略。

  • 基于线程数
    线程数模式按照资源的并发线程数(即该资源正在执行的线程数)进行流量控制。

    并发线程数限流用于保护业务线程数不被耗尽。例如,当应用所依赖的下游应用由于某种原因导致服务不稳定、响应延迟增加,对于调用者来说,意味着吞吐量下降和更多的线程数占用,极端情况下甚至导致线程池耗尽。为应对太多线程占用的情况,业内有使用隔离的方案,比如通过不同业务逻辑使用不同线程池来隔离业务自身之间的资源争抢(线程池隔离)。这种隔离方案虽然隔离性比较好,但是代价就是线程数目太多,线程上下文切换的 overhead 比较大,特别是对低延时的调用有比较大的影响。Sentinel 并发线程数限流不负责创建和管理线程池,而是简单统计当前请求上下文的线程数目,如果超出阈值,新的请求会被立即拒绝,效果类似于信号量隔离。

控制效果

流控方式(控制效果)指的是,当阈值类型为 QPS 时,选择如何控制流量,处理被拦截的流量,实现流量塑形。流量控制的手段包括以下几种:快速失败、Warm Up、排队等待。

说明 控制效果仅对 QPS 限流生效。

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

  • Warm Up
    当系统长期处于空闲的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过 Warm Up 模式(预热模式),让通过的流量缓慢增加,经过设置的预热时间以后,到达系统处理请求速率的设定值。

    Warm Up 模式默认会从设置的 QPS 阈值的 1/3 开始慢慢往上增加至 QPS 设置值。

  • 排队等待
    排队等待模式下会严格控制请求通过的间隔时间,即请求会匀速通过,允许部分请求排队等待,通常用于消息队列削峰填谷等场景。需设置具体的超时时间,当计算的等待时间超过超时时间时请求就会被拒绝。

    例如,QPS 配置为 5,则代表请求每 200 ms 才能通过一个,多出的请求将排队等待通过。超时时间代表最大排队时间,超出最大排队时间的请求将会直接被拒绝。排队等待模式下,QPS 设置值不要超过 1000(请求间隔 1 ms)。

image
排队等待