亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何設計戈魯丁程序來處理 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 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號