欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go中的動(dòng)態(tài)速率限制有效控制流量

 更新時(shí)間:2023年10月17日 11:20:58   作者:TimLiu  
這篇文章主要為大家介紹了Go中的動(dòng)態(tài)速率限制有效控制流量,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

介紹

速率限制是構(gòu)建可擴(kuò)展和彈性系統(tǒng)的關(guān)鍵技術(shù)。它通過(guò)對(duì)指定時(shí)間范圍內(nèi)允許的請(qǐng)求數(shù)量施加限制來(lái)幫助控制流量。在Go中實(shí)現(xiàn)速率限制可以確保最佳的資源利用,并保護(hù)您的應(yīng)用程序免受過(guò)度流量或?yàn)E用行為的影響。在這篇博文中,我們將探索Go中的速率限制技術(shù),并提供實(shí)用的代碼示例來(lái)幫助您有效地實(shí)現(xiàn)它們。

理解速率限制

速率限制包括定義一組規(guī)則,這些規(guī)則決定客戶端在給定的時(shí)間窗口內(nèi)可以發(fā)出多少請(qǐng)求。確保系統(tǒng)能夠處理負(fù)載,防止濫用或拒絕服務(wù)攻擊。限制速率的兩種常見(jiàn)方法是:

  • 固定窗口速率限制:在這種方法中,速率限制在固定的時(shí)間窗口內(nèi)強(qiáng)制執(zhí)行。例如,如果速率限制設(shè)置為每分鐘100個(gè)請(qǐng)求,系統(tǒng)將在任何給定的60秒窗口中允許最多100個(gè)請(qǐng)求。超過(guò)此限制的請(qǐng)求將被拒絕或延遲到下一個(gè)時(shí)間窗口。
  • 令牌桶速率限制:令牌桶速率限制是基于從一個(gè)桶中消耗令牌的概念。桶最初由固定數(shù)量的令牌填充,每個(gè)令牌代表一個(gè)請(qǐng)求。當(dāng)客戶端想要發(fā)出請(qǐng)求時(shí),它必須從桶中獲取令牌。如果桶為空,客戶端必須等待,直到令牌可用。

在GO中實(shí)現(xiàn)速率限制

Go提供了一個(gè)名為golang.org/x/time/rate的內(nèi)置包,提供速率限制功能。讓我們探討一下如何同時(shí)使用固定窗口和令牌桶方法來(lái)實(shí)現(xiàn)速率限制。

固定窗口

func fixedWindowRateLimiting() {
    limiter := rate.NewLimiter(rate.Limit(100), 1) // 允許每秒100次
    for i := 0; i < 200; i++ {
        if !limiter.Allow() {
            fmt.Println("Rate limit exceeded. Request rejected.")
            continue
        }
        go process()
    }
}
// 處理請(qǐng)求
func process() {
    fmt.Println("Request processed successfully.")
    time.Sleep(time.Millisecond) // 模擬請(qǐng)求處理時(shí)間
}

在上面的代碼片段中,我們創(chuàng)建了一個(gè)限制使用率。速率限制為每秒100個(gè)請(qǐng)求的NewLimiter。對(duì)每個(gè)請(qǐng)求調(diào)用limiter.Allow()方法,如果允許請(qǐng)求,則返回true;如果超過(guò)速率限制,則返回false。如果超過(guò)速率限制,請(qǐng)求將被拒絕。

對(duì)應(yīng)的輸出為,清楚的看到部分請(qǐng)求已經(jīng)被拒絕了:

Request processed successfully.
Rate limit exceeded. Request rejected.
Rate limit exceeded. Request rejected.
Rate limit exceeded. Request rejected.
Rate limit exceeded. Request rejected.
Rate limit exceeded. Request rejected.
Rate limit exceeded. Request rejected.
Rate limit exceeded. Request rejected.
...

令牌桶

func tokenBucketRateLimiting() {
    limiter := rate.NewLimiter(rate.Limit(10), 5)
    ctx, _ := context.WithTimeout(context.TODO(), time.Millisecond)
    for i := 0; i < 200; i++ {
        if err := limiter.Wait(ctx); err != nil {
            fmt.Println("Rate limit exceeded. Request rejected.")
            continue
        }
        go process()
    }
}

// 處理請(qǐng)求
func process() {
    fmt.Println("Request processed successfully.")
    time.Sleep(time.Millisecond) // 模擬請(qǐng)求處理時(shí)間
}

在上述代碼中,我們使用 rate.NewLimiter 創(chuàng)建了一個(gè)限制器,其速率限制為每秒 10 個(gè)請(qǐng)求,突發(fā) 5 個(gè)請(qǐng)求。每個(gè)請(qǐng)求都會(huì)調(diào)用 limiter.Wait() 方法,該方法會(huì)阻塞直到有令牌可用。如果水桶是空的,沒(méi)有可用的令牌,請(qǐng)求就會(huì)被拒絕。

對(duì)應(yīng)的輸出為,清楚的看到部分請(qǐng)求已經(jīng)被拒絕了:

Request processed successfully.
Rate limit exceeded. Request rejected.
Rate limit exceeded. Request rejected.
Request processed successfully.
Rate limit exceeded. Request rejected.

動(dòng)態(tài)速率限制

動(dòng)態(tài)速率限制是指根據(jù)客戶端行為、系統(tǒng)負(fù)載或業(yè)務(wù)規(guī)則等動(dòng)態(tài)因素調(diào)整速率限制。這種技術(shù)允許您實(shí)時(shí)調(diào)整速率限制,以優(yōu)化資源利用率并提供更好的用戶體驗(yàn)。讓我們看看 Go 中動(dòng)態(tài)速率限制的示例:

func dynamicRateLimiting() {
    limiter := rate.NewLimiter(rate.Limit(10), 1) // 允許每秒100次
    // Dynamic rate adjustment
    go func() {
        time.Sleep(time.Second * 10) // 每10秒調(diào)整 limiter
        fmt.Println("---adjust limiter---")
        limiter.SetLimit(rate.Limit(200)) // 將 limiter 提升到每秒 200
    }()
    for i := 0; i < 3000; i++ {
        if !limiter.Allow() {
            fmt.Println("Rate limit exceeded. Request rejected.")
            time.Sleep(time.Millisecond * 100)
            continue
        }
        process()
    }
}
// 處理請(qǐng)求
func process() {
    fmt.Println("Request processed successfully.")
    time.Sleep(time.Millisecond * 10) // 模擬請(qǐng)求處理時(shí)間
}

在上面的代碼片段中,我們創(chuàng)建了一個(gè)限制器,初始速率限制為每秒 10 個(gè)請(qǐng)求。然后,我們啟動(dòng)一個(gè) goroutine,在 10秒鐘后將速率限制調(diào)整為每秒 200 個(gè)請(qǐng)求。這樣,我們就能根據(jù)不斷變化的情況動(dòng)態(tài)調(diào)整速率限制。

對(duì)應(yīng)的輸出為,這里我們可以看到中途的時(shí)候,某些請(qǐng)求已經(jīng)被拒絕掉了,后來(lái)我們通過(guò)動(dòng)態(tài)調(diào)整,后續(xù)的請(qǐng)求都可以正常通過(guò)了:

...
Request processed successfully.
Rate limit exceeded. Request rejected.
Request processed successfully.
---adjust limiter---
Rate limit exceeded. Request rejected.
Request processed successfully.
Request processed successfully.
Request processed successfully.
Request processed successfully.
Request processed successfully.
...

自適應(yīng)速率限制

自適應(yīng)速率限制可根據(jù)之前請(qǐng)求的響應(yīng)時(shí)間或錯(cuò)誤率動(dòng)態(tài)調(diào)整速率限制。它允許系統(tǒng)自動(dòng)適應(yīng)不同的流量條件,確保最佳性能和資源利用率。讓我們看看 Go 中自適應(yīng)速率限制的示例:

func adaptiveRateLimiting() {
    limiter := rate.NewLimiter(rate.Limit(10), 1) // 允許每秒10次
    // 自適應(yīng)調(diào)整
    go func() {
        for {
            time.Sleep(time.Second * 10)
            responseTime := measureResponseTime() // 測(cè)量之前請(qǐng)求的響應(yīng)時(shí)間
            if responseTime > 500*time.Millisecond {
                fmt.Println("---adjust limiter 50---")
                limiter.SetLimit(rate.Limit(50))
            } else {
                fmt.Println("---adjust limiter 100---")
                limiter.SetLimit(rate.Limit(100))
            }
        }
    }()
    for i := 0; i < 3000; i++ {
        if !limiter.Allow() {
            fmt.Println("Rate limit exceeded. Request rejected.")
            time.Sleep(time.Millisecond * 100)
            continue
        }
        process()
    }
}
// 測(cè)量以前請(qǐng)求的響應(yīng)時(shí)間
// 執(zhí)行自己的邏輯來(lái)測(cè)量響應(yīng)時(shí)間
func measureResponseTime() time.Duration {
    return time.Millisecond * 100
}
// 處理請(qǐng)求
func process() {
    fmt.Println("Request processed successfully.")
    time.Sleep(time.Millisecond * 10) // 模擬請(qǐng)求處理時(shí)間
}

在上述代碼片段中,我們使用 measureResponseTime 函數(shù)模擬測(cè)量之前請(qǐng)求的響應(yīng)時(shí)間。根據(jù)測(cè)量到的響應(yīng)時(shí)間,我們通過(guò)使用 limiter.SetLimit 設(shè)置不同的值來(lái)動(dòng)態(tài)調(diào)整速率限制。這樣,系統(tǒng)就能根據(jù)觀察到的響應(yīng)時(shí)間調(diào)整其速率限制策略。

對(duì)應(yīng)的輸出為:

Request processed successfully.
Rate limit exceeded. Request rejected.
Request processed successfully.
Rate limit exceeded. Request rejected.
---adjust limiter 100---
Request processed successfully.
Request processed successfully.
Request processed successfully.
Request processed successfully.
Request processed successfully.

總結(jié)

速率限制是維護(hù) Go 應(yīng)用程序穩(wěn)定性和安全性的基本技術(shù)。通過(guò)有效控制傳入請(qǐng)求的流量,您可以防止資源耗盡并確保資源的公平分配。在這篇博文中,我們探討了固定窗口和令牌桶速率限制的概念,并提供了代碼片段,演示如何使用 golang.org/x/time/rate 包在 Go 中實(shí)現(xiàn)它們。將速率限制納入您的應(yīng)用程序,以構(gòu)建能夠高效處理不同流量水平的彈性系統(tǒng)。

當(dāng)然可以使用第三方庫(kù)來(lái)實(shí)現(xiàn),比如說(shuō):go.uber.org/ratelimit

以上就是Go中的動(dòng)態(tài)速率限制有效控制流量的詳細(xì)內(nèi)容,更多關(guān)于Go流量動(dòng)態(tài)控制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決 Golang VS Code 插件下載安裝失敗的問(wèn)題

    解決 Golang VS Code 插件下載安裝失敗的問(wèn)題

    這篇文章主要介紹了解決 Golang VS Code 插件下載安裝失敗,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Go數(shù)據(jù)庫(kù)遷移的實(shí)現(xiàn)步驟

    Go數(shù)據(jù)庫(kù)遷移的實(shí)現(xiàn)步驟

    本文主要介紹了Go數(shù)據(jù)庫(kù)遷移的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Go語(yǔ)言利用Unmarshal解析json字符串的實(shí)現(xiàn)

    Go語(yǔ)言利用Unmarshal解析json字符串的實(shí)現(xiàn)

    本文主要介紹了Go語(yǔ)言利用Unmarshal解析json字符串的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 自己動(dòng)手用Golang實(shí)現(xiàn)約瑟夫環(huán)算法的示例

    自己動(dòng)手用Golang實(shí)現(xiàn)約瑟夫環(huán)算法的示例

    這篇文章主要介紹了自己動(dòng)手用Golang實(shí)現(xiàn)約瑟夫環(huán)算法的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Go代碼檢查的推薦工具及使用詳解

    Go代碼檢查的推薦工具及使用詳解

    這篇文章主要為大家介紹了Go代碼檢查的推薦工具及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解Golang中下劃線的使用方法

    詳解Golang中下劃線的使用方法

    這篇文章主要介紹了詳解Golang中下劃線的使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Go語(yǔ)言 go程釋放操作(退出/銷毀)

    Go語(yǔ)言 go程釋放操作(退出/銷毀)

    這篇文章主要介紹了Go語(yǔ)言 go程釋放操作(退出/銷毀),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • go-zero源碼閱讀之布隆過(guò)濾器實(shí)現(xiàn)代碼

    go-zero源碼閱讀之布隆過(guò)濾器實(shí)現(xiàn)代碼

    布隆過(guò)濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中。它的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都比一般的算法要好的多,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難,這篇文章主要介紹了go-zero源碼閱讀-布隆過(guò)濾器,需要的朋友可以參考下
    2023-02-02
  • 使用Go語(yǔ)言進(jìn)行安卓開(kāi)發(fā)的詳細(xì)教程

    使用Go語(yǔ)言進(jìn)行安卓開(kāi)發(fā)的詳細(xì)教程

    本文將介紹如何使用Go語(yǔ)言進(jìn)行安卓開(kāi)發(fā),我們將探討使用Go語(yǔ)言進(jìn)行安卓開(kāi)發(fā)的優(yōu)點(diǎn)、準(zhǔn)備工作、基本概念和示例代碼,通過(guò)本文的學(xué)習(xí),你將了解如何使用Go語(yǔ)言構(gòu)建高效的安卓應(yīng)用程序,需要的朋友可以參考下
    2023-11-11
  • Go語(yǔ)言中的反射原理解析與應(yīng)用

    Go語(yǔ)言中的反射原理解析與應(yīng)用

    反射(Reflection)是計(jì)算機(jī)科學(xué)中的一個(gè)重要概念,它允許程序在運(yùn)行時(shí)檢查變量和值,獲取它們的類型信息,并且能夠修改它們,本文將結(jié)合實(shí)際案例,詳細(xì)介紹Go語(yǔ)言中反射的基本概念、關(guān)鍵函數(shù)以及使用場(chǎng)景,需要的朋友可以參考下
    2024-10-10

最新評(píng)論