流量控制
1. 概述(Overview)
流量控制(Traffic Control)是一套用于确保系统在有限资源约束下保持稳定、高可用、可预测运行的治理体系。它通过在不同层次对流量进行识别、度量、限制和削峰,实现 资源保护、防止过载、削峰填谷、平滑突发流量、保障核心业务稳定 等目标。
流量控制不是单一技术,而是一套 从策略 → 流量模型 → 算法 → 分层限流 → 治理体系 的完整系统。
2. 流量控制的本质(Essence)
流量控制的核心矛盾:
系统资源有限VS访问流量不可控且可能波动极大
因此需要建立一个能在资源逼近极限时进行自动管控的体系,使得系统在高压场景下仍能 提供可预测、稳定、可退化的服务能力。
其本质包括:
- **资源保护**:保护 CPU、内存、线程池、数据库连接等稀缺资源
- **服务能力匹配**:使下游能力与上游流量匹配
- **风控与业务保护**:避免因为突发流量导致全局性故障
- **系统容错能力**:通过拒绝、降级、排队等方式避免系统雪崩
- **服务质量治理**:防止个别接口抢占过多资源
3. 流量控制能力模型(Capability Model)
一个完整的流量控制体系至少包含以下模块:
3.1 流量画像(Traffic Profiling)
- 流量分布(分钟级/秒级/突发情况)
- 访问类型(读、写、热点、背景任务)
- 调用链路影响范围
3.2 指标体系(Metrics System)
系统能力边界依赖关键指标,包括:
- **TPS(事务数/秒)**
- **HPS(请求数/秒)**
- **QPS(查询数/秒)**
- 延迟 P99/P95/P90
- 最大并发数
- IO 带宽、网络带宽
不同业务还存在自定义指标:如游戏的在线人数、IO 服务的最大带宽等。
3.3 控制策略(Control Policies)
- 固定限流(静态阈值)
- 动态限流(根据RT、错误率、拥塞情况实时调整)
- 排队/柔性限流(非快速失败)
- 业务层面限流(库存、抽奖次数、秒杀总量)
3.4 分层限流体系(Layered Control)
最关键的系统性原则:不信任上层限流
- **前端**:柔性限流、随机延时、熔断部分请求
- **网关层**:统一限流策略、访问频控、IP 限制
- **应用层**:接口级限流、线程池限流
- **下游层**:DB、缓存、RPC 下游保护
分层限流的目标:
避免某一层限流失效导致全局崩溃
4. 流量承载能力与水位模型(Capacity & Waterline)
系统承载能力必须通过:
- **全链路压测**
- **历史高峰数据**
- **资源评估(CPU、线程、连接池、IO)**
确定两类水位:
- **安全水位**:系统在稳定范围可承载的流量
- **极限水位**:系统在极端情况下能承受的最大极限
过低浪费资源,过高会导致雪崩。
5. 流量控制核心技术模型(Algorithms & Models)
5.1 计数器算法(Counter)
原理:维护一个当前活动请求数计数器,超过阈值即限流。典型实现:线程池大小、数据库连接池大小、Nginx worker limit。
固定时间窗计数

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

更精确,按前 N 时间片累计请求数判断。
5.2 队列限流(Queue / FIFO)
(参考:/软件工程/性能工程.html#排队论)
所有请求入队,由后端消费端按能力处理。可扩展:
- 多队列多优先级
- 加入最长期限(避免过长等待)
- 排队超时快速失败
5.3 漏桶算法(Leaky Bucket)

本质:限制处理速率(Rate)
- 入桶不限速
- 出桶以固定速率处理
- 桶满则丢弃流量
适合:瞬时高并发,希望处理更平滑 的场景。
5.4 令牌桶算法(Token Bucket)
本质:限制平均速率 + 允许突发流量
- 固定速率向桶中增加令牌
- 请求需要消耗令牌
- 允许桶中积累一定额度 → 支持突发
Guava 示例保留(略)
5.5 动态限流(Adaptive Throttling)
借鉴 TCP 拥塞控制。
方法:
- 统计 RT P99/P95
- RT 超出阈值 → 自动下降阈值(如降为 ½)
- RT 恢复 → 逐步增加阈值
用于构建:
- 自动调参型限流系统
- 高频量变化系统
6. 分布式限流模型(Distributed Throttling)
6.1 单机限流(Local)
按节点均分配额,在各节点执行限流。动态调整配额 → 防止流量倾斜。
6.2 全局限流(Global)
一个集中式限流服务负责发放配额:
- 本地缓存兜底策略
- 限流服务器异常时 fallback
- 同时支持开关控制
6.3 货币令牌(Quota Token)
请求链路携带额度 token:
- 每调用一次减少额度
- 额度耗尽时停止或向中心申请新额度
- 多系统协同限流效果最佳
7. 流量切换与扩展(Traffic Switching & Scaling)
7.1 扩展(Scaling)
上游扩容 → 下游必须同步扩展避免 “上游把下游打死” 的情况。
7.2 流量切换(Traffic Switching)
- **DNS**
- **虚拟 IP(VIP)**
- **应用层(Nginx / 网关)**
用于蓝绿、灰度、金丝雀发布。
8. 超额流量处理策略(Overflow Strategies)
系统接近极限时必须采取:
8.1 快速失败(Fail Fast)
减少资源浪费。
8.2 排队(Queue)
等待资源恢复。
8.3 柔性限流(Soft Throttling)
用户不明显感知:
- 随机延迟再发起请求
- 某些次要请求随机丢弃
- 前端本地缓存/去抖
8.4 降级(Degrade)
- 降级非核心接口
- 返回默认值
- 限制写操作
- 去掉昂贵查询
9. 限流阈值确定(Threshold Design)
确定限流阈值四种途径:
- **历史观测**:根据业务高峰 QPS
- **压测**:最可靠,确定能力边界
- **经验借鉴**:适用于行业标准业务
- **资源计算**:CPU/线程/IO 理论最大承载与业务模型计算
10. 流量控制治理体系(Governance System)
10.1 可观测性(Observability)
必须监控:
- QPS/HPS/TPS
- RT(P90/P99)
- 线程池队列长度
- DB/Redis 连接池使用率
- 限流次数、拒绝比率
- 下游依赖健康度
10.2 演进方式(Evolution)
- 静态 → 动态限流
- 单节点 → 分布式限流
- 被动限流 → 主动预测限流
- IP 限流 → 用户画像限流(AI Risk Control)
10.3 选型方法论
按场景选择:
| 场景 | 推荐算法 |
|---|---|
| 强一致速率控制 | 漏桶 |
| 允许突发 | 令牌桶 |
| 并发控制 | 计数器 |
| 可排队任务 | FIFO 队列 |
| 高频波动业务 | 动态限流 |
| 分布式架构 | 全局限流 / 货币令牌 |
关联内容(自动生成)
- [/软件工程/架构/系统设计/可用性.html](/软件工程/架构/系统设计/可用性.html) 流量控制与可用性密切相关,包括限流、降级、熔断等策略保障系统可用性
- [/软件工程/微服务/服务治理/服务容错.html](/软件工程/微服务/服务治理/服务容错.html) 服务容错机制涵盖流量控制中的熔断、限流、降级等策略,是保障系统稳定的重要手段
- [/软件工程/架构/系统设计/网关.html](/软件工程/架构/系统设计/网关.html) 网关承担着流量控制的重要职能,实现统一限流策略、访问频控等功能
- [/软件工程/软件设计/代码质量/软件测试/全链路压测.html](/软件工程/软件设计/代码质量/软件测试/全链路压测.html) 全链路压测是确定流量控制阈值的重要手段,通过压测可确定系统安全水位和极限水位
- [/软件工程/架构/系统设计/伸缩性.html](/软件工程/架构/系统设计/伸缩性.html) 伸缩性与流量控制相互配合,通过指标监控和自动化扩缩容应对流量变化
- [/软件工程/质量工程.html](/软件工程/质量工程.html) 质量工程包含流量控制相关的性能保障措施,如全链路压测、混沌工程等
- [/软件工程/架构/系统设计/监控系统设计.html](/软件工程/架构/系统设计/监控系统设计.html) 监控系统是流量控制的重要支撑,提供QPS、TPS等关键指标监控
- [/软件工程/容量保障.html](/软件工程/容量保障.html) 容量保障与流量控制密切相关,通过QPS、TPS等指标确定系统容量和限流阈值
- [/软件工程/架构/系统设计/高并发.html](/软件工程/架构/系统设计/高并发.html) 高并发系统设计中需要综合运用流量控制的各种算法和策略
- [/软件工程/架构/系统设计/缓存.html](/软件工程/架构/系统设计/缓存.html) 缓存与流量控制同为系统保护手段,可减轻后端服务压力,缓解流量冲击
- [/计算机网络/运输层.html](/计算机网络/运输层.html) 运输层的流量控制机制(滑动窗口)与应用层流量控制在原理上相通
- [/软件工程/架构/架构治理.html](/软件工程/架构/架构治理.html) 架构治理包含了流量控制等非功能性需求的治理和规范
- [/编程语言/JAVA/JAVA并发编程/线程池.html](/编程语言/JAVA/JAVA并发编程/线程池.html) 线程池是流量控制在单机层面的重要实现,通过限制并发数控制流量
- [/中间件/数据库/分库分表中间件.html](/中间件/数据库/分库分表中间件.html) 数据库中间件的限流功能是流量控制在数据访问层面的具体应用
- [/软件工程/架构/系统设计/混沌工程.html](/软件工程/架构/系统设计/混沌工程.html) 混沌工程可验证流量控制策略在异常场景下的有效性
- [/计算机网络/多媒体网络.html](/计算机网络/多媒体网络.html) 多媒体网络中的漏桶机制与流量控制中的漏桶算法原理一致,用于动态管控流量
- [/软件工程/性能工程.html](/软件工程/性能工程.html) 性能工程涉及流量控制相关的性能指标和排队论原理