我有一个微服务架构应用程序,其中多个服务轮询外部 API。外部 API 的速率限制为每分钟 600 个请求。如何让所有实例一起保持在共享 600 速率限制以下?
Google只给我带来了3个解决方案,最有希望的是:
myntra/golimit是这三个中最有前途的,但我实际上不知道如何设置它。
wallstreetcn/rate似乎仅在达到限制时才拒绝(我的应用程序需要等到它可以发出请求)并且funcEvery
中的函数rate.NewLimiter
似乎是不同的导入/依赖项,我无法弄清楚它是什么
manavo/go-rate-limiter有一个“软”限制,显然,这可能会让我超过限制。有些端点如果几秒钟内无法访问我并不介意,但其他端点请求应该尽可能有效。
目前我有一个业余解决方案。下面的代码允许我设置每分钟的限制,并且它在请求之间休眠以将请求分散到一分钟内。此客户端速率限制是针对每个实例的,因此我必须对 600 个请求除以实例数量进行硬编码。
var semaphore = make(chan struct{}, 5)
var rate = make(chan struct{}, 10)
func init(){
// leaky bucket
go func() {
ticker := time.NewTicker(100 * time.Millisecond)
defer ticker.Stop()
for range ticker.C {
_, ok := <-rate
// if this isn't going to run indefinitely, signal
// this to return by closing the rate channel.
if !ok {
return
}
}
}()
以及发出 http API 请求的函数内部。
rate <- struct{}{}
// check the concurrency semaphore
semaphore <- struct{}{}
defer func() {
<-semaphore
}()
如何让所有实例一起保持在共享 600 速率限制以下?
首选项: - 基于密钥的速率限制计数器,因此可以设置多个计数器。- 在设定的持续时间内分散请求,以便在前 30 秒内而不是在整分钟持续时间内发送 600 个请求。
拉风的咖菲猫
慕森王