目标

本文主要介绍常见的限速算法,以及这些算法在 Golang 中有哪些开源实现,并提供一些简单的示例。


限速算法简介

常见的限速算法有:


漏斗算法的实现

1,uber/ratelimit:

项目地址:

https://github.com/uber-go/ratelimit

安装:

使用示例:

运行上面的示例,将看到类似下面的输出:

在上面的例子中,限流器每秒可以通过 100 个请求,每个请求间隔 10 ms。如果想了解更多关于 uber/ratelimit 的信息,可以参考文末列出的文档。


令牌桶算法的实现

1,golang.org/x/time/rate

文档地址:

https://pkg.go.dev/golang.org/x/time/rate

安装:

使用示例:

运行上面的例子,将看到类似下面的输出:

除了 Allow/AllowN 之外,rate/Limter 还提供了 Wait/WaitN、Reserver/ReserverN 等方法。如果想了解更多关于 golang.org/x/time/rate 的信息,可以参考文末列出的文档。


滑动窗口算法的实现

1,sentinel-golang

项目地址:

https://github.com/alibaba/sentinel-golang

安装:

使用示例:

运行上面的例子,将看到类似下面的输出:

当触发流控时,Sentinel 不仅支持拒绝请求,还支持匀速排队。如果想了解更多关于 Sentinel Go 的信息,请参考文末列出的文档。


例子

需求描述:

文件中有 20 个图片的 URL,要求分别使用每个 URL 调用图片识别服务的接口,但是图片识别服务将请求速率限制为最大 2 张/秒。

示例代码:

接下来使用 uber/ratelimit 实现(也可以使用其它限速器,比如 Sentinel Go 等):


Read More