为了账号安全,请及时绑定邮箱和手机立即绑定

如何设计戈鲁丁程序来处理 API 限制错误

如何设计戈鲁丁程序来处理 API 限制错误

Go
慕莱坞森 2022-10-04 19:43:18
刚开始了解戈鲁丁的力量。我有大约100个帐户和大约10个区域,循环浏览它们以创建~1000个goroutine,以提高阅读速度。它工作得太快了,以至于达到了20 /秒的API返回限制。如何确保所有戈鲁丁都能保持在 (20/s) 的最大呼叫速率?我不确定哪种 golang 并发方法最适合一起处理错误。例如:func readInstance(acc string, region string, wg *sync.WaitGroup) {    defer wg.Done()    response, err := client.DescribeInstances(acc, region)    if err != nil {        log.Println(err) // API limit exceeding 20        return    }    .    .    .    .}func main() {    accounts := []string{"g", "h", "i", ...}    regions := []string{"g", "h", "i", ...}    for _, region := range regions {        for i := 0; i < len(accounts); i++ {            wg.Add(1)            go readInstance(accounts[i], region, &wg)        }    }    wg.Wait()}
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

如果对在特定实时量内可以执行的请求数有固定的上限,则可以使用时间。新投票器()将事情分开。

c := time.NewTicker(50 * time.Millisecond)
defer c.Stop()

现在,当您要发出服务器请求时,只需插入

<- c.C

在实际请求之前。


查看完整回答
反对 回复 2022-10-04
?
噜噜哒

TA贡献1784条经验 获得超7个赞

我想你可以试试这个:https://github.com/uber-go/ratelimit


根据文档,它是并发安全的。


import (

    "fmt"

    "time"


    "go.uber.org/ratelimit"

)


func main() {

    rl := ratelimit.New(100) // per second


    prev := time.Now()

    for i := 0; i < 10; i++ {

        now := rl.Take()

        fmt.Println(i, now.Sub(prev))

        prev = now

    }


    // Output:

    // 0 0

    // 1 10ms

    // 2 10ms

    // 3 10ms

    // 4 10ms

    // 5 10ms

    // 6 10ms

    // 7 10ms

    // 8 10ms

    // 9 10ms

}


查看完整回答
反对 回复 2022-10-04
  • 2 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信