api - 使用 golang 服务器的第三方 API 的速率限制

标签 api go limit rate

您好,我有一个使用第三方 API 的带有 gorilla-mux 的 Go 后端。我有一些向此 API 发出请求的处理程序。我的限制是每秒 5 个请求。

我如何实现某种整体速率限制系统,其中请求排队并仅在容量可用时发送(或五个插槽中的一个是空闲的)?谢谢。

最佳答案

对于对第 3 方 API 的速率限制请求,您可以使用 Golang 库 golang.org/x/time/rate

示例用法

package main

import (
    "context"
    "log"
    "net/http"
    "time"

    "golang.org/x/time/rate"
)

func main() {
    rl := rate.NewLimiter(rate.Every(10*time.Second), 50)
    reqURL := "https://www.google.com"
    c := http.Client{}

    req, err := http.NewRequest("GET", reqURL, nil)
    if err != nil {
        log.Fatal("failed to create request: %v", err)
    }
    for i := 0; i < 300; i++ {
        // Waiting for rate limiter
        err = rl.Wait(context.Background())
        if err != nil {
            log.Println("failed to wait: %v", err)
        }
        // and doing the requests if the rate is not exceeded
        _, err := c.Do(req)
        if err != nil {
            log.Println("failed to wait: %v", err)
        }
    }
}

重要!!! 这不是多个实例使用的解决方案! 如果您要生成多个服务器,您应该考虑使用 Redis 来同步限制器 (https://github.com/go-redis/redis_rate)。

关于api - 使用 golang 服务器的第三方 API 的速率限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71977854/

相关文章:

python - 如何使用 Pinnacle Sports API 的 Python 包装器查询实际市场

api - SSL:如果我从我的站点连接到没有 SSL 的另一个站点的 API,连接是否受到保护?

C# API 生成器

http - 从 net/http.Request.RemoteAddr 获取 IP 地址最干净的方法是什么

java - 期望使用改造开始对象错误

go - 如何使用 kubernetes go-client 获取与 kubectl 提供的相同的 Pod 状态信息

go - 如果键总是唯一的,同时写入 Golang 映射是否安全?

php - 在特定查询上使用 sql LIMIT 1

php - 有限制的用户列表

java - 强制对象字段仅具有从父类继承的某些值