跳到主要内容

BBR 算法

· 阅读需 5 分钟
ahKevinXy

什么是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

}
  1. cpu
    • cpu 指标函数,cpu的使用率
  2. passStat
    • 请求数的采样数据,使用滑动窗口进行统计
  3. rtStat
    • 响应时间的采样数据,同样使用滑动窗口进行统计
  4. inFlight
    • inFlight 当前系统中的请求数,数据得来方法是:中间件原理在处理前+1,处理handle之后不管成功失败都减去1
  5. bucketPerSecond
    • 一个 bucket 的时间
  6. prevDropTime
    • 上次触发限流时间
  7. bucketSize
    • 桶的数量
  8. maxPASSCache
    • 单个采样窗口中最大的请求数的缓存数据
  9. minRtCache
    • 单个采样窗口中最小的响应时间的缓存数据
  10. opts
    • 限流参数