在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ Go速率限制實(shí)例
Go panic錯(cuò)誤處理實(shí)例
Go命令行參數(shù)實(shí)例
Go可變參數(shù)的函數(shù)實(shí)例
Go通道同步實(shí)例
Go非阻塞通道操作實(shí)例
Go指針實(shí)例
Go數(shù)字解析實(shí)例
Go語言指針
Go超時(shí)(timeouts)實(shí)例
Go速率限制實(shí)例
Go信號實(shí)例
Go Base64編碼實(shí)例
Go計(jì)時(shí)器實(shí)例
Go命令行標(biāo)志實(shí)例
Go原子計(jì)數(shù)器實(shí)例
Go語言切片
Go隨機(jī)數(shù)實(shí)例
Go語言類型轉(zhuǎn)換
Go排序?qū)嵗?/span>
Go時(shí)間格式化/解析實(shí)例
Go URL解析實(shí)例
Go字符串函數(shù)實(shí)例
Go語言常量
Go for循環(huán)語句實(shí)例
Go函數(shù)多個(gè)返回值實(shí)例
Go切片實(shí)例
Go行過濾器實(shí)例
Go語言接口
Go語言數(shù)組
Go語言變量
Go字符串格式化實(shí)例
Go斷續(xù)器實(shí)例
Go if/else語句實(shí)例
Go通道緩沖實(shí)例
Go錯(cuò)誤實(shí)例
Go語言映射
Go執(zhí)行過程實(shí)例
Go函數(shù)實(shí)例
Go有狀態(tài)的goroutines實(shí)例
Go按自定義函數(shù)排序?qū)嵗?/span>
Go語言作用域規(guī)則
Go時(shí)代(Epoch)實(shí)例
Go變量實(shí)例
Go互斥體實(shí)例
Go語言范圍(range)
Go程序?qū)嵗?/span>
Go語言入門
Go通道路線實(shí)例
Go閉包(匿名函數(shù))實(shí)例
Go Select實(shí)例
Go通道范圍實(shí)例
Go集合函數(shù)實(shí)例
Hello World程序?qū)嵗?/span>
Go環(huán)境變量實(shí)例
Go語言運(yùn)算符
Go讀取文件實(shí)例
Go延遲(defer)實(shí)例
Go SHA1哈希實(shí)例
Go語言條件和決策
Go語言錯(cuò)誤處理
Go通道實(shí)例
Go指針實(shí)例
Go時(shí)間日期實(shí)例
Go語言字符串
Go語言循環(huán)
Go語言基礎(chǔ)語法
Go語言開發(fā)環(huán)境安裝配置
Go常量實(shí)例
Go語言結(jié)構(gòu)體
Go寫文件實(shí)例
Go正則表達(dá)式實(shí)例
Go JSON實(shí)例
Go語言教程
Go關(guān)閉通道實(shí)例
Go接口實(shí)例
Go語言遞歸
Go switch語句實(shí)例
Go函數(shù)遞歸實(shí)例
Go退出程序?qū)嵗?/span>
Go語言程序結(jié)構(gòu)
Go范圍實(shí)例
Go語言函數(shù)
Go工作池實(shí)例
Go語言數(shù)據(jù)類型

Go速率限制實(shí)例

速率限制是控制資源利用和維持服務(wù)質(zhì)量的重要機(jī)制。通過goroutines,channelticker都可以優(yōu)雅地支持速率限制。

首先我們來看一下基本速率限制。假設(shè)想限制對傳入請求的處理。我們會在相同名稱的通道上放送這些要求。

這個(gè)限制器通道將每200毫秒接收一個(gè)值。這是速率限制方案中的調(diào)節(jié)器。

通過在服務(wù)每個(gè)請求之前阻塞來自限制器信道的接收,我們限制自己每200毫秒接收1個(gè)請求。

我們可能希望在速率限制方案中允許短脈沖串請求,同時(shí)保持總體速率限制??梢酝ㄟ^緩沖的限制器通道來實(shí)現(xiàn)。這個(gè)burstyLimiter通道將允許最多3個(gè)事件的突發(fā)。

填充通道以表示允許突發(fā)。

200毫秒,將嘗試向burstyLimiter添加一個(gè)新值,最大限制為3?,F(xiàn)在模擬5個(gè)更多的傳入請求。這些傳入請求中的前3個(gè)未超過burstyLimiter值。

運(yùn)行程序后,就會看到第一批請求每?200毫秒處理一次。

對于第二批請求,程序會立即服務(wù)前3個(gè),因?yàn)橥话l(fā)速率限制,然后剩余2服務(wù)都具有?200ms延遲。

所有的示例代碼,都放在 F:\worksp\golang 目錄下。安裝Go編程環(huán)境請參考:http://www.yiibai.com/go/go_environment.html

rate-limiting.go的完整代碼如下所示 -

package main

import "time"
import "fmt"

func main() {

    // First we'll look at basic rate limiting. Suppose
    // we want to limit our handling of incoming requests.
    // We'll serve these requests off a channel of the
    // same name.
    requests := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        requests <- i
    }
    close(requests)

    // This `limiter` channel will receive a value
    // every 200 milliseconds. This is the regulator in
    // our rate limiting scheme.
    limiter := time.Tick(time.Millisecond * 200)

    // By blocking on a receive from the `limiter` channel
    // before serving each request, we limit ourselves to
    // 1 request every 200 milliseconds.
    for req := range requests {
        <-limiter
        fmt.Println("request", req, time.Now())
    }

    // We may want to allow short bursts of requests in
    // our rate limiting scheme while preserving the
    // overall rate limit. We can accomplish this by
    // buffering our limiter channel. This `burstyLimiter`
    // channel will allow bursts of up to 3 events.
    burstyLimiter := make(chan time.Time, 3)

    // Fill up the channel to represent allowed bursting.
    for i := 0; i < 3; i++ {
        burstyLimiter <- time.Now()
    }

    // Every 200 milliseconds we'll try to add a new
    // value to `burstyLimiter`, up to its limit of 3.
    go func() {
        for t := range time.Tick(time.Millisecond * 200) {
            burstyLimiter <- t
        }
    }()

    // Now simulate 5 more incoming requests. The first
    // 3 of these will benefit from the burst capability
    // of `burstyLimiter`.
    burstyRequests := make(chan int, 5)
    for i := 1; i <= 5; i++ {
        burstyRequests <- i
    }
    close(burstyRequests)
    for req := range burstyRequests {
        <-burstyLimiter
        fmt.Println("request", req, time.Now())
    }
}

執(zhí)行上面代碼,將得到以下輸出結(jié)果 -

F:\worksp\golang>go run rate-limiting.go
request 1 2017-01-21 14:43:39.1445218 +0800 CST
request 2 2017-01-21 14:43:39.345767 +0800 CST
request 3 2017-01-21 14:43:39.5460635 +0800 CST
request 4 2017-01-21 14:43:39.7441739 +0800 CST
request 5 2017-01-21 14:43:39.9444929 +0800 CST
request 1 2017-01-21 14:43:39.9464898 +0800 CST
request 2 2017-01-21 14:43:39.9504928 +0800 CST
request 3 2017-01-21 14:43:39.9544955 +0800 CST
request 4 2017-01-21 14:43:40.1467214 +0800 CST
request 5 2017-01-21 14:43:40.3469624 +0800 CST