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 )。

TA貢獻1842條經驗 獲得超13個贊
如果我理解得很好,你有一個應該連接到 API Y 的應用程序 X,并且 X 每秒不能向 Y 發送超過 5 個請求。
這是一個復雜且不完整的場景。讓我問幾個問題
X 上的預期負載是多少?如果它低于每秒 5 個請求……沒關系
X 上的超時時間是多少?想象一下,你每秒收到 50 個請求……在這種情況下,你可能需要 10 秒來回答一些請求,可以嗎?
在 X 超時的情況下,客戶端會重試嗎?
如果你每秒調用 Y 超過 5 個請求會發生什么?
來自 Y 的響應是否可緩存?
你有多個服務器/自動縮放嗎?
一種可能性是在應用程序上設置速率限制器以匹配 API 上的限制。
另一個是盡可能多地調用 API。如果由于請求過多而失敗,您可以實施重試邏輯或放棄。
如果出于某種原因需要非常小心地使用此 API,并且不需要運行多個實例/自動縮放,則解決方案是在應用程序上使用速率限制器。
如果你需要運行多個實例,你需要一些東西來集中訪問這個 API,這是一件非常微妙的事情……它是一個單點故障。您可以實現一個每秒僅傳送 5 個令牌的令牌系統。獲得令牌后,您就可以訪問 API。這是一種可能性。
天下沒有免費的午餐。每種解決方案都有利有弊。但是如果你可以避免執行對 API 的請求(比如緩存結果)或者如果你只需要存儲數據(并運行異步程序)就將消息添加到隊列中……也許會更容易討論更好的解決方案
- 3 回答
- 0 關注
- 194 瀏覽
添加回答
舉報