第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

golang.org/x/time/rate api 請(qǐng)求的速率限制

golang.org/x/time/rate api 請(qǐng)求的速率限制

Go
MMTTMM 2022-05-23 16:21:40
我已經(jīng)創(chuàng)建了一個(gè)函數(shù),用于在一天內(nèi)限制 50 個(gè) API 登錄請(qǐng)求。變量限制 = 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)    })}這是正確的嗎?因?yàn)楫?dāng)我嘗試它時(shí),它仍然通過。功能限制不起作用。我懷疑 NewLimiter() limiter := rate.NewLimiter(1, limit)這是否意味著一個(gè)用戶每天只能請(qǐng)求登錄 50 個(gè)請(qǐng)求?(我已經(jīng)閱讀了文檔,但我不明白。)
查看完整描述

2 回答

?
莫回?zé)o

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)


查看完整回答
反對(duì) 回復(fù) 2022-05-23
?
叮當(dāng)貓咪

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


查看完整回答
反對(duì) 回復(fù) 2022-05-23
  • 2 回答
  • 0 關(guān)注
  • 209 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)