Skip to content

Commit

Permalink
doc: update docs
Browse files Browse the repository at this point in the history
  • Loading branch information
WTIFS committed Oct 30, 2023
1 parent 5b46766 commit 5f20492
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 3 deletions.
8 changes: 6 additions & 2 deletions plugin/ratelimiter/bbr/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ BBR CPU 自适应限流组件参考了 [TCP BBR](https://en.wikipedia.org/wiki/T

BBR 的思路为:根据应用的请求处理时间、请求成功数、最大并发数这些指标,计算当前应用能承载的最大并发请求量,再对比当前系统并发量,判断是否应当拦截本次流量,即所谓"自适应"。

BBR 的源码实现可参考:[yuemoxi - 从kratos分析BBR限流源码实现](https://juejin.cn/post/7004848252109455368)
BBR 的源码实现可参考:
- [乔卓越 - 深入理解云原生下自适应限流技术原理与应用](https://mp.weixin.qq.com/s?__biz=MzA4ODg0NDkzOA==&mid=2247493581&idx=1&sn=62feb928915eaeb9082b58737829cf19&chksm=90215828a756d13e36cf77fe980f90810236296e5289259e085ccda7a539979c0716b5c8a601&scene=126&sessionid=1634901423&key=92c891f823e779d59fb069c1f73467971e77ea57597e6305cd46077c5115f63362682acb7d71e10dce269b227d3823d11ef9e5ce4116448fda19babccca00938bb97159b2d212d3a739c461a317a413867734e4ff39439da6d669943638ebb44fb5d44b939ae294b9b2eb42fa68fe939e1e4b21d8d806bf0299ecfea6bfa0c80&ascene=0&uin=MTg4NzU0NzUzNw%3D%3D&devicetype=Windows+10+x64&version=63040026&lang=zh_CN&exportkey=AyWZkGTg8xpxVEKYWHzdFvE%3D&pass_ticket=aPS1JJrPDslKIxzL8eyKwCG9loYdUIDyJU6iO22glE0yHlC3foSNMEFaklAFVWTj&wx_header=0&fontgear=2#)
- [yuemoxi - 从kratos分析BBR限流源码实现](https://juejin.cn/post/7004848252109455368)



Expand Down Expand Up @@ -43,7 +45,9 @@ func (l *BBR) maxInFlight() int64 {
- `maxPass * bucketPerSecond / 1000` 为每毫秒处理的请求数
- `l.minRT()` 为 单个采样窗口中最小的响应时间
- 0.5为向上取整
- 则上述公式表示每毫秒能同时处理的最多请求数。用当前并发请求数 `inFlight` 与计算值比较,判断是否触发限流
- 当CPU利用率过载时,就需要通过上述预期公式进行干预。在服务运行期间持续统计当前服务的请求数,即 `inFlight`,通过在滑动窗口内的所有buckets中比较得出最多请求完成数 `maxPass`,以及最小的耗时 `minRT`,相乘就得出了预期的最佳请求数 `maxInFlight`
- `maxInFlight` 表示系统能同时处理的最多请求数,这个水位是一个平衡点,保持该水位可以最大化系统的处理能力,超过该水位则会导致请求堆积。
- 通过 `inFlight``maxInFlight` 对比,如果前者大于后者那么就已经过载,进而拒绝后续到来的请求防止服务过载。

## 代码结构
```go
Expand Down
6 changes: 5 additions & 1 deletion plugin/ratelimiter/bbr/core/bbr.go
Original file line number Diff line number Diff line change
Expand Up @@ -236,14 +236,18 @@ func (l *BBR) minRT() int64 {
return rawMinRT
}

// maxInFlight 每毫秒能同时处理的最多请求数。用当前并发请求数 inFlight 与 maxInFlight 比较,判断是否触发限流
// maxInFlight 每毫秒能同时处理的最多请求数
// maxPass * bucketPerSecond / 1000 为每毫秒处理的请求数
// l.minRT() 为 单个采样窗口中最小的响应时间
// 0.5为向上取整
func (l *BBR) maxInFlight() int64 {
return int64(math.Floor(float64(l.maxPASS()*l.minRT()*l.bucketPerSecond)/1000.0) + 0.5)
}

// shouldDrop 是否应当抛弃本次请求
// 在服务运行期间持续统计当前服务的并发处理请求数,即 inFlight,通过在滑动窗口内的所有buckets中比较得出最多请求完成数 maxPass,以及最小的耗时 minRT,相乘就得出了预期的最佳请求数 maxInFlight。
// maxInFlight 表示系统能同时处理的最多请求数,这个水位是一个平衡点,保持该水位可以最大化系统的处理能力,超过该水位则会导致请求堆积。
// 通过 inFlight 与 maxInFlight 对比,如果前者大于后者那么就已经过载,进而拒绝后续到来的请求防止服务过载。
func (l *BBR) shouldDrop() bool {
now := time.Duration(time.Now().UnixNano())
if l.cpu() < l.opts.CPUThreshold {
Expand Down

0 comments on commit 5f20492

Please sign in to comment.