流量控制

1. 概述(Overview)

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

流量控制不是单一技术,而是一套 从策略 → 流量模型 → 算法 → 分层限流 → 治理体系 的完整系统。


2. 流量控制的本质(Essence)

流量控制的核心矛盾:

系统资源有限VS访问流量不可控且可能波动极大

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

其本质包括:


3. 流量控制能力模型(Capability Model)

一个完整的流量控制体系至少包含以下模块:

3.1 流量画像(Traffic Profiling)

3.2 指标体系(Metrics System)

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

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

3.3 控制策略(Control Policies)

3.4 分层限流体系(Layered Control)

最关键的系统性原则:不信任上层限流

分层限流的目标:

避免某一层限流失效导致全局崩溃


4. 流量承载能力与水位模型(Capacity & Waterline)

系统承载能力必须通过:

确定两类水位:

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


5. 流量控制核心技术模型(Algorithms & Models)

5.1 计数器算法(Counter)

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

固定时间窗计数

固定时间窗

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

滑动窗口计数

滑动窗口

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


5.2 队列限流(Queue / FIFO)

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

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


5.3 漏桶算法(Leaky Bucket)

202001271537

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

适合:瞬时高并发,希望处理更平滑 的场景。


5.4 令牌桶算法(Token Bucket)

2020789425

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

Guava 示例保留(略)


5.5 动态限流(Adaptive Throttling)

借鉴 TCP 拥塞控制。

方法:

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

用于构建:


6. 分布式限流模型(Distributed Throttling)

6.1 单机限流(Local)

按节点均分配额,在各节点执行限流。动态调整配额 → 防止流量倾斜。

6.2 全局限流(Global)

一个集中式限流服务负责发放配额:

6.3 货币令牌(Quota Token)

请求链路携带额度 token:


7. 流量切换与扩展(Traffic Switching & Scaling)

7.1 扩展(Scaling)

上游扩容 → 下游必须同步扩展避免 “上游把下游打死” 的情况。

7.2 流量切换(Traffic Switching)

用于蓝绿、灰度、金丝雀发布。


8. 超额流量处理策略(Overflow Strategies)

系统接近极限时必须采取:

8.1 快速失败(Fail Fast)

减少资源浪费。

8.2 排队(Queue)

等待资源恢复。

8.3 柔性限流(Soft Throttling)

用户不明显感知:

8.4 降级(Degrade)


9. 限流阈值确定(Threshold Design)

确定限流阈值四种途径:

  1. **历史观测**:根据业务高峰 QPS
  2. **压测**:最可靠,确定能力边界
  3. **经验借鉴**:适用于行业标准业务
  4. **资源计算**:CPU/线程/IO 理论最大承载与业务模型计算

10. 流量控制治理体系(Governance System)

10.1 可观测性(Observability)

必须监控:

10.2 演进方式(Evolution)

10.3 选型方法论

按场景选择:

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

关联内容(自动生成)