uber-go/ratelimit

GitHub: uber-go/ratelimit

一个基于漏桶算法的 Go 语言限流库,通过阻塞式 Take() 调用实现精确的每秒操作数控制。

Stars: 4707 | Forks: 328

# Go rate limiter [![GoDoc](https://pkg.go.dev/badge/go.uber.org/ratelimit)][doc] [![Coverage Status](https://codecov.io/gh/uber-go/ratelimit/branch/master/graph/badge.svg?token=zhLeUjjrm2)][cov] ![test](https://github.com/uber-go/ratelimit/workflows/test/badge.svg) 这个包提供了漏桶(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工具, 并发控制, 开发工具库, 日志审计, 漏桶算法, 限流器