2 回答

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

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