YmRatelimit 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
YmRatelimit 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
授权协议: 未知
开发语言: Google Go
操作系统: 跨平台
收录时间: 2020-06-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()

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

YmRatelimit 的相关资讯

还没有任何资讯

YmRatelimit 的相关博客

还没有任何博客,写博客

YmRatelimit 的相关问答

还没有任何问答,马上提问

评论 (3)

加载中
07/17 17:47
回复
举报
ymretelimit 打错了,应该是 ymratelimit 结尾部分: " rl := ymretelimit.NewLeakyBucket(time.Second, 15) // per second rl.TakeAvailable() rl = ymretelimit.NewTokenBucket(time.Microsecond, 15) // per Microsecond rl.TakeAvailable() "
07/10 17:41
回复
举报
狗眼看世界软件作者
大佬们可以使用尝试了
06/17 19:47
回复
举报
更多评论
3 评论
14 收藏
分享
返回顶部
顶部