2 回答

TA貢獻1865條經驗 獲得超7個贊
從費率文檔:
func NewLimiter(r Limit, b int) *Limiter
NewLimiter 返回一個新的限制器,它允許事件的速率達到 r 并允許最多 b 個令牌的突發。
所以第一個參數是速率限制,而不是第二個。Burst 是您希望允許發生的請求數量快于速率限制 - 通常使用一個值1來禁止突發,任何更高的值都會在常規速率限制啟動之前允許此數量的請求。無論如何.. .
要根據rate.Limit您的需要創建,您可以使用輔助函數rate.Every():
rt := rate.Every(24*time.Hour / 50)
limiter := rate.NewLimiter(rt, 1)

TA貢獻1776條經驗 獲得超12個贊
NewLimited(1, 50)
表示 1 個請求/秒,最多 50 個請求。它是一個令牌桶,這意味著有 50 個令牌,每個接受的 API 調用使用一個令牌,并且令牌以給定的速率重新生成,最多burst
. 您的代碼正在為每個 IP 地址創建一個限制器,因此這是每個 IP 地址的限制(我猜您將其近似為一個 IP 地址是一個用戶)。
如果您在單個持久服務器上運行,并且服務器和代碼永遠不會重新啟動,那么您可以通過指定速率50 / (3600*24)
和 50 的突發來獲得每個用戶每天 50 個請求。(注意:3600*24
是一天中的秒數)。但是您正在使用的速率限制包并不是為這種粗略的速率限制而設計的(按每天請求的順序)——它旨在防止服務器在短期內因流量過大而過載(按每秒請求的順序) )。
您可能需要一個可與數據庫或類似工具一起使用的速率限制器(可能使用令牌桶方案,因為這可以有效地實現)??赡茉谀硞€地方有一個包裹,但我不知道我的頭頂有一個。
- 2 回答
- 0 關注
- 217 瀏覽
添加回答
舉報