Golang Go语言中 限流器 time/rate 使用介绍

发布于 1周前 作者 sinazl 来自 Go语言

Golang Go语言中 限流器 time/rate 使用介绍

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

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

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

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


更多关于Golang Go语言中 限流器 time/rate 使用介绍的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

原文链接: https://www.cyhone.com/articles/usage-of-golang-rate/
同时欢迎关注公众号:编程沉思录

更多关于Golang Go语言中 限流器 time/rate 使用介绍的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


赞,最近刚好需要

不错,这个比 juju/ratelimit 多了动态设置参数功能,用 juju/ratelimit 要改参数还得用新建替换的方式曲线处理.

其实我一直有个疑惑
这样的令牌桶方式和生产者和消费者模式有什么区别

求楼主博客搭建方式,我的有点不好看,xmge.top

上面描述令牌桶的原理,听起来像是用生产者消费者实现。虽然这也是一种实现方式,但是实际 golang 的这个实现采用了在消费之前再生产 token 数目的方式,而且也不是用 blockingqueue 的方式承载 token,而且用简单的记录 token 数目,然后转换成对应时间差值的方式。
具体原理,我会在今天或明天再发一篇文章讲解,欢迎关注公众号编程沉思录或者同名知乎专栏,可以第一时间收到推送~

我的跟你一样也是用的 hexo 的 next 主题,我用的 next 的 Gemini 皮肤,自己稍微修改了下样式。
博客当成静态网站放在了自己的服务器上,所以比直接放在 github 稍微快点~

对 time/rate 的原理实现分析也已发了文章《 Golang 限流器 time/rate 实现剖析》
链接: https://v2ex.com/t/616449#reply2

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

在Golang中,time/rate是一个强大的限流器,它基于令牌桶算法实现,能够有效控制事件发生的速率。以下是关于time/rate限流器的使用介绍:

一、基本原理

令牌桶算法的核心思想是以恒定频率向桶中放入令牌,服务请求时从桶中取出令牌,若桶中无令牌则拒绝服务。time/rate限流器通过Limiter结构体实现这一算法,提供了灵活的API来控制并发速率。

二、常用API

  1. *NewLimiter(r Limit, b int) Limiter:创建一个新的限流器,r表示每秒生成的令牌数,b表示令牌桶的容量。
  2. Allow() bool:检查是否可以消费一个令牌,可以则返回true并消费,否则返回false。
  3. AllowN(t time.Time, n int) bool:检查是否可以消费n个令牌,可以则返回true并消费,否则返回false。
  4. *Reserve() Reservation:预订一个令牌,返回一个Reservation对象,可用于获取等待时间或取消预订。
  5. Wait(ctx context.Context) error:阻塞等待直到可以消费一个令牌或上下文取消。
  6. WaitN(ctx context.Context, n int) error:阻塞等待直到可以消费n个令牌或上下文取消。

三、应用场景

time/rate限流器广泛应用于API请求频率限制、防止暴力破解、控制并发请求等场景,是保障服务稳定性和可靠性的重要工具。

回到顶部