限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。 限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket 等。
其实 golang 标准库中就自带了限流算法的实现,即 golang.org/x/time/rate。 该限流器是基于 Token Bucket(令牌桶)实现的。
简单来说,令牌桶就是想象有一个固定大小的桶,系统会以恒定速率向桶中放 Token,桶满则暂时不放。 而用户则从桶中取 Token,如果有剩余 Token 就可以一直取。如果没有剩余 Token,则需要等到系统中被放置了 Token 才行。
1
cyhone OP 原文链接: https://www.cyhone.com/articles/usage-of-golang-rate/
同时欢迎关注公众号:编程沉思录 |
2
lbp0200 2019-11-02 21:21:29 +08:00 via iPhone
赞,最近刚好需要
|
3
freestyle 2019-11-02 23:31:37 +08:00 via iPhone
不错,这个比 juju/ratelimit 多了动态设置参数功能,用 juju/ratelimit 要改参数还得用新建替换的方式曲线处理.
|
4
zzlettle 2019-11-03 13:56:44 +08:00
其实我一直有个疑惑
这样的令牌桶方式和生产者和消费者模式有什么区别 |
5
xmge 2019-11-03 13:56:48 +08:00
很棒
|
7
cyhone OP @zzlettle 上面描述令牌桶的原理,听起来像是用生产者消费者实现。虽然这也是一种实现方式,但是实际 golang 的这个实现采用了在消费之前再生产 token 数目的方式,而且也不是用 blockingqueue 的方式承载 token,而且用简单的记录 token 数目,然后转换成对应时间差值的方式。
具体原理,我会在今天或明天再发一篇文章讲解,欢迎关注公众号编程沉思录或者同名知乎专栏,可以第一时间收到推送~ |
8
cyhone OP @xmge 我的跟你一样也是用的 hexo 的 next 主题,我用的 next 的 Gemini 皮肤,自己稍微修改了下样式。
博客当成静态网站放在了自己的服务器上,所以比直接放在 github 稍微快点~ |
10
cyhone OP 对 time/rate 的原理实现分析也已发了文章《 Golang 限流器 time/rate 实现剖析》
链接: https://v2ex.com/t/616449#reply2 欢迎关注公众号及同名知乎专栏,第一时间收到文章推送:编程沉思录 |