什么是bbr 算法
自适应限流 从整体维度对应应用入口流量进行控制,结合应用的Load CPU使用率,总体平均RT,入口QPS和并发线程等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统负载达到一个平衡,让系统尽可能跑到最大吞吐量的同时保证系统整体的稳定性
核心目标
- 自动嗅探负载和qps,减少人工配置
- 削顶,保证超载时系统不奔溃,并能以高水准qps运行
限流规则
计算吞吐量 : 利特尔法则: L=λ * W
指标说明
- 入口QPS: 指的是从外部访问系统的请求数,即请求数/秒
- 入口RT: 指的是从外部访问系统的平均响应时间,即响应时间/秒
- 入口CPU使用率: 指的是从外部访问系统的平均CPU使用率,即CPU使用率/秒
- 入口并发线程数: 指的是从外部访问系统的并发线程数
- 系统负载: 指的是系统的平均CPU使用率,即CPU使用率/秒
- 系统平均RT: 指的是系统的平均响应时间,即响应时间/秒
- 系统并发线程数: 指的是系统的并发线程数
指标名称 | 指标含义 |
---|---|
cpu | 最近1s cpu使用率均值,使用滑动平均计算,采样周期250ms |
inflight | 当前处理中正在进行处理的请求数量 |
pass | 请求处理成功数量 |
rt | 请求成功响应耗时 |
滑动窗口
在自适应限流保护,采集到的指标的时效性强,系统只需要采集最近一段时间的指标,通过滑动窗口的方式,计算出当前系统的吞吐量,并根据系统的负载和QPS,动态调整限流阈值
自适应限流策略
- 动态调整限流阈值: 动态调整限流阈值,根据系统的负载和QPS,动态调整限流阈值
- 动态调整阈值: 动态调整限流阈值,根据系统的
限流公式
L = λ * W
cpu > 800 AND (Now - PrevDrop) < 1s AND (MaxPass * MinRt * windows / 1000) < InFlight
MaxPass 表示最近 5s 内,单个采样窗口中最大的请求数。 MinRt 表示最近 5s 内,单个采样窗口中最小的响应时间。 windows 表示一秒内采样窗口的数量,默认配置中是 5s 50 个采样,那么 windows 的值为 10。
限流阈值
- 静态阈值: 静态阈值,在系统启动时,设置一个固定阈值,不随系统负载和QPS的变化而变化
- 动态阈值: 动态阈值,在系统启动时,设置一个初始阈值,随着系统负载和QPS的变化而变化
源码分析
BBR struct
package main
type BBR struct {
cpu cpuGetter
passStat window.RollingCounter
rtStat window.RollingCounter
inFlight int64
bucketPerSecond int64
bucketSize time.Duration
prevDropTime atomic.Value
maxPASSCache atomic.Value
minRtCache atomic.Value
opts *options
}
cpu
- cpu 指标函数,cpu的使用率
passStat
- 请求数的采样数据,使用滑动窗口进行统计
rtStat
- 响应时间的采样数据,同样使用滑动窗口进行统计
inFlight
- inFlight 当前系统中的请求数, 数据得来方法是:中间件原理在处理前+1,处理handle之后不管成功失败都减去1
bucketPerSecond
- 一个 bucket 的时间
prevDropTime
- 上次触发限流时间
bucketSize
- 桶的数量
maxPASSCache
- 单个采样窗口中最大的请求数的缓存数据
minRtCache
- 单个采样窗口中最小的响应时间的缓存数据
opts
- 限流参数