YmRatelimit流量控制工具

联合创作 · 2023-09-27 08:17

ymratelimit 是一个使用 golang 编写的高性能流量控制工具,实现了Leaky bucket和Token bucket两个算法。 


目前现在已经在生产系统大规模使用,部署在线上数百台服务上,最大业务支撑 20wqps。目前线上已经稳定使用。


设计初衷



  1.   禁止使用锁

  2.   每次请求尽量控制在一次cas操作

  3.   所有计数都转化成int64的操作,尽量减少cpu额外计算浪费 

  4.  精度精确,支持到纳秒级别的流量控制


性能测试


我们测试使用之前使用的github.com/juju/ratelimit,下面为测试结果



➜ ymratelimit git:(master) ✗ go test -bench=. -run=none
goos: darwin
goarch: amd64
pkg: github.com/maczam/ymratelimit
BenchmarkYmretelimit-4 14109680 79.9 ns/op
BenchmarkParallelYmretelimit-4 44515245 28.5 ns/op
BenchmarkJujuRatelimit-4 10214019 111 ns/op
BenchmarkParallelJujuRatelimit-4 6336103 160 ns/op
PASS
ok github.com/maczam/ymratelimit 4.978s

➜ ymratelimit git:(master) ✗ go test -bench=. -benchmem -run=none
goos: darwin
goarch: amd64
pkg: github.com/maczam/ymratelimit
BenchmarkYmretelimit-4 14484910 80.0 ns/op 0 B/op 0 allocs/op
BenchmarkParallelYmretelimit-4 42125070 27.6 ns/op 0 B/op 0 allocs/op
BenchmarkJujuRatelimit-4 10546452 111 ns/op 0 B/op 0 allocs/op
BenchmarkParallelJujuRatelimit-4 6592738 171 ns/op 0 B/op 0 allocs/op
PASS
ok github.com/maczam/ymratelimit 5.034s

使用简单


使用非常简单,非常方便迁入到系统



rl := ymretelimit.NewLeakyBucket(time.Second, 15) // per second
rl.TakeAvailable()

rl = ymretelimit.NewTokenBucket(time.Microsecond, 15) // per Microsecond
rl.TakeAvailable()

 

浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报