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

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

使用 golang 服務器的第三方 API 的速率限制

使用 golang 服務器的第三方 API 的速率限制

Go
慕雪6442864 2022-12-05 16:48:21
您好,我有一個使用第三方 API 的帶有 gorilla-mux 的 Go 后端。我有一些向此 API 發出請求的處理程序。我的限制是每秒 5 個請求。我如何實現某種整體速率限制系統,其中請求排隊并僅在容量可用時發送(或五個插槽中的一個是空閑的)?謝謝。
查看完整描述

3 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

對于對 3rd 方 API 的速率限制請求,您可以使用 Golang library 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 )。


查看完整回答
反對 回復 2022-12-05
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

也許你可以試試這個:https ://github.com/dypflying/leakybucket ,假設漏桶算法速率限制器可能適合你的場景。



查看完整回答
反對 回復 2022-12-05
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

如果我理解得很好,你有一個應該連接到 API Y 的應用程序 X,并且 X 每秒不能向 Y 發送超過 5 個請求。

這是一個復雜且不完整的場景。讓我問幾個問題

  1. X 上的預期負載是多少?如果它低于每秒 5 個請求……沒關系

  2. X 上的超時時間是多少?想象一下,你每秒收到 50 個請求……在這種情況下,你可能需要 10 秒來回答一些請求,可以嗎?

  3. 在 X 超時的情況下,客戶端會重試嗎?

  4. 如果你每秒調用 Y 超過 5 個請求會發生什么?

  5. 來自 Y 的響應是否可緩存

  6. 你有多個服務器/自動縮放嗎?

一種可能性是在應用程序上設置速率限制器以匹配 API 上的限制。

另一個是盡可能多地調用 API。如果由于請求過多而失敗,您可以實施重試邏輯或放棄。

如果出于某種原因需要非常小心地使用此 API,并且不需要運行多個實例/自動縮放,則解決方案是在應用程序上使用速率限制器。

如果你需要運行多個實例,你需要一些東西來集中訪問這個 API,這是一件非常微妙的事情……它是一個單點故障。您可以實現一個每秒僅傳送 5 個令牌的令牌系統。獲得令牌后,您就可以訪問 API。這是一種可能性。

天下沒有免費的午餐。每種解決方案都有利有弊。但是如果你可以避免執行對 API 的請求(比如緩存結果)或者如果你只需要存儲數據(并運行異步程序)就將消息添加到隊列中……也許會更容易討論更好的解決方案


查看完整回答
反對 回復 2022-12-05
  • 3 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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