流量控制

概述

流量控制(Traffic Control)是一套用于确保系统在有限资源约束下保持稳定、高可用、可预测运行的治理体系。它通过在不同层次对流量进行识别、度量、限制和削峰,实现 资源保护、防止过载、削峰填谷、平滑突发流量、保障核心业务稳定 等目标。

流量控制的本质

流量控制的核心矛盾:系统资源有限 VS 访问流量不可控且可能波动极大

因此需要建立一个能在资源逼近极限时进行自动管控的体系,使得系统在高压场景下仍能 提供可预测、稳定、可退化的服务能力

其目标包括:

限流适用边界

适用前提

限流的有效性建立在以下条件之上:

  1. **存在资源瓶颈**—— 限流保护的是稀缺资源(CPU、内存、线程池、连接池)。无瓶颈则限流徒增复杂度
  2. **流量不可控**—— 限流的核心价值是管控无法预知的流量冲击。可控流量应优先用资源规划
  3. **需要公平性**—— 多用户/多调用方共享资源时,限流防止少数方抢占过多资源
  4. **瓶颈可观测**—— 限流依赖对资源状态的实时感知(CPU、线程池、RT)。若无法感知瓶颈,限流阈值无依据

限流的代价

引入限流需要权衡:

问题影响
误杀正常请求用户体验下降
增加系统复杂度运维成本提升
引入额外延迟吞吐量下降
阈值设置不当资源浪费或保护失效

限流维度

同一个请求,可以消耗 1ms CPU,也可以消耗 10 秒线程。QPS 相同,资源消耗可能相差万倍。

核心维度:

两者是不同的维度,描述同一资源压力的不同侧面。只控 QPS 不控并发:高 QPS + 慢请求 → 线程堆积;只控并发不控 QPS:高并发 + 快请求 → 下游过载。

维度选择由瓶颈位置决定:下游有限 → 侧重 QPS;资源池有限 → 侧重并发;高 QPS + 慢请求 → 两维组合。

流量控制能力模型

流量控制是闭环系统:识别流量特征 → 感知系统状态 → 执行控制行动。三模块对应闭环三环节,缺一则闭环断裂。

流量画像

指标体系

系统能力边界依赖关键指标,包括:

不同业务还存在自定义指标:如游戏的在线人数、IO 服务的最大带宽等。

控制策略

限流策略(控制流量不超限):

超额处理策略(流量已超限后如何应对):

流量承载能力与水位模型

系统承载能力必须通过:

确定两类水位:

过低浪费资源,过高会导致雪崩。

限流阈值确定

阈值回答的是:系统能承受多少?该留多少余量?

压测优先——阈值是测出来的,不是猜出来的。观测数据只能反映"曾经来过多少",无法回答"系统极限是多少"。用真实流量模型压到系统临界点,在重压力区上限设阈值,而非崩溃区。

冗余原则——无法压测时,阈值 = 历史峰值 × (1 + 冗余系数)。冗余覆盖三类不确定性:流量波动、下游衰退、局部故障。核心接口冗余更大。

分层原则——阈值沿调用链路逐层加严:入口宽松、应用精确、下游最严。游阈值总和应低于上游入口处理能力,避免流量堆积。

动态原则——静态阈值迟早失灵。阈值必须可运行时调整,理想形态是基于 RT/错误率的自适应调节。

流量控制核心技术模型

计数器算法

原理:维护一个当前活动请求数计数器,超过阈值即限流。典型实现:线程池大小、数据库连接池大小、Nginx worker limit。

固定时间窗计数

算法类型:固定时间窗 (Fixed Window)限制条件:每 1 分钟限制 100 次请求 (Limit 100 per 1min)时间轴分布:|-------------------------|-------------------------|------------------->0:00                    1:00                      2:00                时间 (Time)          [ 上一周期 ]              [ 当前周期 ]          (Last Cycle)            (Current Cycle)流量爆发点:                0:55      1:00      1:05                  ●--------|---------●                  |        |         |                  +--------+---------+                  |  100次 |  100次  |                  +--------+---------+                  <------- 10秒 ------->                        共 200 次请求

问题:在窗口切换的边界点可能出现突发流量未被限制。

滑动窗口计数

时间片 (Time Slices)      ---------------------------------------------> (滑动方向)      +------+------+------+------+------+------+------+      |  10  |  7   |  5   |  15  |  0   |  0   |  0   |      +------+------+------+------+------+------+------+             ^~~~~~~~~~~~~~~~~~~~~^                滑动窗口 (Window)
滑窗 (Sliding Window)      ----------------------------> (数据流/处理方向)      +------+------+------+------+------+------+------+      |  0   |  7   |  5   |  15  |  8   |  5   |  7   |      +------+------+------+------+------+------+------+      ^~~~~~~^                           ^~~~~~~~~~~~~^      (已滑过)                            (当前窗口/活跃)

更精确,按前 N 时间片累计请求数判断。

队列限流

(参考:/软件工程/性能工程.html#排队论)

所有请求入队,由后端消费端按能力处理。可扩展:

漏桶算法

[ 数据输入 / 流量注入 ]  <-- 可能是突发、不规律的 (Unregulated)              |              |  (滴水/排队)              v      +-------+-------+      |               |      |   [ 桶 / 队列 ]  |  <-- 缓冲区 (Buffer),容量为 B      |  (已缓存的数据)  |      |               |      +-------+-------+              |              |  (恒定速率流出)              v      [ 数据输出 / 转发 ]     <-- 恒定速率 R (Regulated / Constant Rate)

本质:限制处理速率(Rate)

适合:出现瞬时高并发的时候,需要平滑流量处理 的场景。

令牌桶算法

r 令牌/秒 (填充速率)          |          |   /-----------\          v  |   ( 令牌 )  |        +----+-----------+----+        |       |~~~~~|       |        |       |~~~~~|       | <--- 桶容量为 b 个令牌        |       |~~~~~|       |        +-------+-------+-----+                |                | (取出令牌)                v  数据包      +-------+  ========>  | 等待  |       / \   (流入)    | 令牌  | ----> <   > ---移除令牌---> 传输至网络             +-------+       \ /         (流出)

本质:限制平均速率 + 允许突发流量

动态限流

借鉴 TCP 拥塞控制。

方法:

  1. 统计 RT P99/P95
  2. RT 超出阈值 → 自动下降阈值(如降为 ½)
  3. RT 恢复 → 逐步增加阈值

用于构建:

分布式限流模型

单机限流:按节点均分配额,各节点独立执行限流。动态调整配额可防止流量倾斜。

全局限流:集中式限流服务统一发放配额。本地缓存作兜底,限流服务异常时 fallback。

货币令牌:请求链路携带额度 token,每调用一次扣减额度,耗尽时向中心申请新额度或多系统协同限流。

选型方法论

按场景选择:

场景推荐算法
强一致速率控制漏桶
允许突发令牌桶
并发控制计数器
可排队任务FIFO 队列
高频波动业务动态限流
分布式架构全局限流 / 货币令牌

演进

流量控制的演进,核心驱动力是流量规模扩张与架构复杂度提升

维度早期演进方向
部署单机限流分布式限流(跨节点协调计数)
阈值静态配置自适应限流(数据驱动反馈,借鉴 TCP 拥塞控制)
响应被动拦截主动预测(流量预测 + HPA 联动)
粒度IP/接口级用户画像精细化(区分正常/恶意流量)
架构分层防御散落沿调用链统一协调(上游缓冲,下游兜底)

关联内容