Golang 限流器 time/rate 使用介绍

2019-11-02 20:37:05 +08:00
 cyhone

限流器是后台服务中的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。 限流器的实现方法有很多种,例如滑动窗口法、Token Bucket、Leaky Bucket 等。

其实 golang 标准库中就自带了限流算法的实现,即 golang.org/x/time/rate。 该限流器是基于 Token Bucket(令牌桶)实现的。

简单来说,令牌桶就是想象有一个固定大小的桶,系统会以恒定速率向桶中放 Token,桶满则暂时不放。 而用户则从桶中取 Token,如果有剩余 Token 就可以一直取。如果没有剩余 Token,则需要等到系统中被放置了 Token 才行。

本文则主要集中介绍下该组件的具体使用方法, 点击查看全文

5370 次点击
所在节点    Go 编程语言
10 条回复
cyhone
2019-11-02 20:37:44 +08:00
原文链接: https://www.cyhone.com/articles/usage-of-golang-rate/
同时欢迎关注公众号:编程沉思录
lbp0200
2019-11-02 21:21:29 +08:00
赞,最近刚好需要
freestyle
2019-11-02 23:31:37 +08:00
不错,这个比 juju/ratelimit 多了动态设置参数功能,用 juju/ratelimit 要改参数还得用新建替换的方式曲线处理.
zzlettle
2019-11-03 13:56:44 +08:00
其实我一直有个疑惑
这样的令牌桶方式和生产者和消费者模式有什么区别
xmge
2019-11-03 13:56:48 +08:00
很棒
xmge
2019-11-03 13:59:39 +08:00
求楼主博客搭建方式,我的有点不好看,xmge.top
cyhone
2019-11-03 16:21:15 +08:00
@zzlettle 上面描述令牌桶的原理,听起来像是用生产者消费者实现。虽然这也是一种实现方式,但是实际 golang 的这个实现采用了在消费之前再生产 token 数目的方式,而且也不是用 blockingqueue 的方式承载 token,而且用简单的记录 token 数目,然后转换成对应时间差值的方式。
具体原理,我会在今天或明天再发一篇文章讲解,欢迎关注公众号编程沉思录或者同名知乎专栏,可以第一时间收到推送~
cyhone
2019-11-03 16:26:17 +08:00
@xmge 我的跟你一样也是用的 hexo 的 next 主题,我用的 next 的 Gemini 皮肤,自己稍微修改了下样式。
博客当成静态网站放在了自己的服务器上,所以比直接放在 github 稍微快点~
a308057848
2019-11-04 09:26:53 +08:00
cyhone
2019-11-05 14:29:44 +08:00
对 time/rate 的原理实现分析也已发了文章《 Golang 限流器 time/rate 实现剖析》
链接: https://v2ex.com/t/616449#reply2

欢迎关注公众号及同名知乎专栏,第一时间收到文章推送:编程沉思录

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/615640

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX