限速与削峰是什么
限速约束的是「单位时间发起多少」,削峰约束的是「不要在同一个瞬间全部发起」。手段分三类:调度侧用固定间隔、随机抖动、分批推进、滚动窗口;网络侧用 Linux 的 tc、iptables 连接数限制或云上带宽包;目标侧依赖服务自身的并发上限与速率限制(HTTP 429 配合 Retry-After 退避)。限速只改变速度不改变总量,所以必须同时定义总量的硬上限与放弃策略。
基本信息
| 适用平台 | 调度侧与平台无关;网络侧为 Linux tc/iptables,Windows 可用 QoS 策略 |
|---|---|
| 关键参数 | sleep 间隔、随机抖动范围、窗口大小、突发额度 |
| 观测指标 | 目标端并发连接数、响应时间、错误率、队列深度 |
| 典型错误 | 只加固定间隔不加抖动,多主机仍然同步 |
典型使用场景
- 对共享数据库批量写操作,避免打满连接池拖垮在线业务
- 调用第三方 API 受配额限制,需要按 QPS 平滑发起
- 大量主机同时拉取制品,避免出口带宽瞬时饱和
- 任务允许跨越较长窗口,但总时长必须可控
- 目标端自身没有限速能力,从发起侧补偿
调度侧限速示例
调度侧限速示例
for h in $(cat hosts); do
ssh -n "$h" 'systemctl restart app' >/dev/null 2>&1 # 单台动作
sleep $((RANDOM % 3 + 1)) # 1~3 秒随机间隔,打散同步
printf '%s\n' "$h" >> done.txt # 记录已完成主机,便于续跑
done
tc qdisc add dev eth0 root tbf rate 50mbit burst 1mb latency 50ms # 网络侧限速限速手段与代价
| 手段 | 作用点 | 代价 |
|---|---|---|
| 固定间隔 sleep | 发起侧 | 总时长被拉长 |
| 随机抖动 | 发起侧 | 失去精确的时间控制 |
| 分批推进 | 调度侧 | 需定义批次大小与批间校验 |
| 令牌桶或连接限制 | 网络与中间件 | 配置复杂,参数需与业务上限对齐 |
| 目标端限速 | 目标服务 | 依赖服务自身是否支持 |
固定间隔的 sleep 在多主机场景下仍然是同步的,因为每台的间隔一致。按主机名哈希取模偏移或加入随机抖动,才能把波峰真正摊平。
限速不会减少总量。窗口内跑不完的任务会顺延到业务高峰,因此需要同时设置总量的硬上限、超时放弃策略,以及「未完成」的告警。