uber-go/ratelimit
GitHub: uber-go/ratelimit
一个基于漏桶算法的 Go 语言限流库,通过阻塞式 Take() 调用实现精确的每秒操作数控制。
Stars: 4707 | Forks: 328
# Go rate limiter [][doc] [][cov] 
这个包提供了漏桶(leaky-bucket)速率限制算法的 Golang 实现。
此实现基于请求之间经过的时间来补充桶,而不需要间隔时钟来离散地补充桶。
创建一个 rate limiter,指定每秒要执行的最大操作数。
在每次操作之前调用 Take()。Take 会休眠,直到你可以继续执行。
```
import (
"fmt"
"time"
"go.uber.org/ratelimit"
)
func main() {
rl := ratelimit.New(100) // per second
prev := time.Now()
for i := 0; i < 10; i++ {
now := rl.Take()
fmt.Println(i, now.Sub(prev))
prev = now
}
// Output:
// 0 0
// 1 10ms
// 2 10ms
// 3 10ms
// 4 10ms
// 5 10ms
// 6 10ms
// 7 10ms
// 8 10ms
// 9 10ms
}
```
## 常见问题:
- 与 https://pkg.go.dev/golang.org/x/time/rate 的主要区别是什么?(基于 #77)
这个 ratelimiter 旨在拥有 (1) 简单的 API 和 (2) 极低的开销。对于更复杂的用例,[x/time/rate] 是一个很好的选择。请参阅[这里][redit]了解历史背景,以及[这里][bench]查看基准测试(来自 2016 年)。
- 为什么我在 Windows 本地运行 example_test.go 时会失败?(基于 #80)
Windows 在计时器精度方面有一些已知问题。参见 golang/go#44343。我们不打算对此进行规避。
标签:EVTX分析, Go, Ruby工具, 并发控制, 开发工具库, 日志审计, 漏桶算法, 限流器