系统防护即从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均 RT、入口 QPS 和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

背景信息

长期以来,系统自适应保护的思路是根据硬指标即系统的负载来做系统过载保护。即当系统负载高于某个阈值,就禁止或者减少流量的进入;若负载恢复,则恢复流量的进入。这样会造成两个不可避免的问题:

  • 若根据负载的情况来调节流量的通过率,则会产生延迟。若当前通过率的调整会导致负载增大,那么至少要过 1 秒之后才能被观测到;同理,若当前通过率调整会使负载降低,也需要 1 秒之后才能继续调整。这种方法会浪费系统的处理能力。导致我们看到的负载曲线产生锯齿。
  • 通过率恢复慢。在下游应用不可靠,应用响应时间很长,从而导致负载很高的场景中,若下游应用恢复时,应用响应时间也会随之减短,此时通过率理应会大幅度增大。但由于此时负载仍然很高,所以通过率的恢复慢。

为解决上述问题,AHAS 应用流控降级在系统自适应保护的做法是:用每分钟的负载作为启动控制流量,使用请求的响应时间以及当前系统正在处理的请求速率来决定通过的流量。旨在在系统不被拖垮的情况下,提高系统的吞吐率。

功能原理

我们把系统处理请求的过程想象为一个水管,到来的请求是往这个水管灌水,当系统处理顺畅的时候,请求不需要排队,直接从水管中穿过,这个请求的RT是最短的;反之,当请求堆积的时候,那么处理请求的时间则会变为:排队时间 + 最短处理时间。

功能原理

若用 T 来表示水管内部的水量,用 RT 来表示请求的处理时间,用 P 来表示进来的请求数,那么一个请求从进入水管道到从水管出来,这个水管会存在 P * RT 个请求。即当 T ≈ QPS * Avg(RT) 的时候,可以认为系统的处理能力和允许进入的请求个数达到了平衡,系统的负载不会继续增加。当入口的流量是水管出来的流量的最大的值的时候,水管的处理能力达到最大利用。

系统规则

系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),例如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。系统规则支持四种阈值类型:

  • Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值且系统当前的并发线程数超过系统容量时才会触发系统保护。
  • RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护。
  • 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

为应用配置系统规则,具体操作步骤请参见新建系统规则