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

刚开始了解戈鲁丁的力量。


我有大约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()

}


慕莱坞森
浏览 78回答 2
2回答

缥缈止盈

如果对在特定实时量内可以执行的请求数有固定的上限,则可以使用时间。新投票器()将事情分开。c&nbsp;:=&nbsp;time.NewTicker(50&nbsp;*&nbsp;time.Millisecond) defer&nbsp;c.Stop()现在,当您要发出服务器请求时,只需插入<-&nbsp;c.C在实际请求之前。

噜噜哒

我想你可以试试这个:https://github.com/uber-go/ratelimit根据文档,它是并发安全的。import (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "time"&nbsp; &nbsp; "go.uber.org/ratelimit")func main() {&nbsp; &nbsp; rl := ratelimit.New(100) // per second&nbsp; &nbsp; prev := time.Now()&nbsp; &nbsp; for i := 0; i < 10; i++ {&nbsp; &nbsp; &nbsp; &nbsp; now := rl.Take()&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(i, now.Sub(prev))&nbsp; &nbsp; &nbsp; &nbsp; prev = now&nbsp; &nbsp; }&nbsp; &nbsp; // Output:&nbsp; &nbsp; // 0 0&nbsp; &nbsp; // 1 10ms&nbsp; &nbsp; // 2 10ms&nbsp; &nbsp; // 3 10ms&nbsp; &nbsp; // 4 10ms&nbsp; &nbsp; // 5 10ms&nbsp; &nbsp; // 6 10ms&nbsp; &nbsp; // 7 10ms&nbsp; &nbsp; // 8 10ms&nbsp; &nbsp; // 9 10ms}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go