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

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

golang.org/x/time/rate api 請求的速率限制

golang.org/x/time/rate api 請求的速率限制

Go
MMTTMM 2022-05-23 16:21:40
我已經創建了一個函數,用于在一天內限制 50 個 API 登錄請求。變量限制 = 50package middlewareimport (    "log"    "net"    "net/http"    "sync"    "time"    "golang.org/x/time/rate")// Create a custom request struct which holds the rate limiter for each// visitor and the last time that the request was seen.type request struct {    limiter  *rate.Limiter    lastSeen time.Time}// Change the the map to hold values of the type request.// defaultTime using 3 minutesvar requests = make(map[string]*request)var mu sync.Mutexfunc getRequest(ip string, limit int) *rate.Limiter {    mu.Lock()    defer mu.Unlock()    v, exists := requests[ip]    if !exists {        limiter := rate.NewLimiter(1, limit)        requests[ip] = &request{limiter, time.Now()}        return limiter    }    // Update the last seen time for the visitor.    v.lastSeen = time.Now()    return v.limiter}func throttle(next http.Handler, limit int) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        ip, _, err := net.SplitHostPort(r.RemoteAddr)        if err != nil {            log.Println(err.Error())            http.Error(w, "Internal Server Error", http.StatusInternalServerError)            return        }        limiter := getRequest(ip, limit)        fmt.Println(limiter.Allow())        if limiter.Allow() == false {            http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests)            return        }        next.ServeHTTP(w, r)    })}這是正確的嗎?因為當我嘗試它時,它仍然通過。功能限制不起作用。我懷疑 NewLimiter() limiter := rate.NewLimiter(1, limit)這是否意味著一個用戶每天只能請求登錄 50 個請求?(我已經閱讀了文檔,但我不明白。)
查看完整描述

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)


查看完整回答
反對 回復 2022-05-23
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

NewLimited(1, 50)表示 1 個請求/秒,最多 50 個請求。它是一個令牌桶,這意味著有 50 個令牌,每個接受的 API 調用使用一個令牌,并且令牌以給定的速率重新生成,最多burst. 您的代碼正在為每個 IP 地址創建一個限制器,因此這是每個 IP 地址的限制(我猜您將其近似為一個 IP 地址是一個用戶)。

如果您在單個持久服務器上運行,并且服務器和代碼永遠不會重新啟動,那么您可以通過指定速率50 / (3600*24)和 50 的突發來獲得每個用戶每天 50 個請求。(注意:3600*24是一天中的秒數)。但是您正在使用的速率限制包并不是為這種粗略的速率限制而設計的(按每天請求的順序)——它旨在防止服務器在短期內因流量過大而過載(按每秒請求的順序) )。

您可能需要一個可與數據庫或類似工具一起使用的速率限制器(可能使用令牌桶方案,因為這可以有效地實現)??赡茉谀硞€地方有一個包裹,但我不知道我的頭頂有一個。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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