清華尹成帶你實戰GO案例(48)Go 請求處理頻率控制

尹成發表於2018-05-22
Go 請求處理頻率控制
頻率控制是控制資源利用和保證服務高質量的重要機制。Go可以使用goroutine,channel和ticker來以優
雅的方式支援頻率控制。
package main
import "time"
import "fmt"
func main() {
// 首先我們看下基本的頻率限制。假設我們得控制請求頻率,
// 我們使用一個通道來處理所有的這些請求,這裡向requests
// 傳送5個資料,然後關閉requests通道
requests := make(chan int, 5)
for i := 1; i <= 5; i++ {
requests <- i
}
close(requests)
// 這個limiter的Ticker每隔200毫秒結束通道阻塞
// 這個limiter就是我們頻率控制處理器
limiter := time.Tick(time.Millisecond * 200)
// 通過阻塞從limiter通道接受資料,我們將請求處理控制在每隔200毫秒
// 處理一個請求,注意`<-limiter`的阻塞作用。
for req := range requests {
<-limiter
fmt.Println("request", req, time.Now())
}
// 我們可以保持正常的請求頻率限制,但也允許請求短時間內爆發
// 我們可以通過通道快取來實現,比如下面的這個burstyLimiter
// 就允許同時處理3個事件。
burstyLimiter := make(chan time.Time, 3)
// 填充burstyLimiter,先傳送3個資料
for i := 0; i < 3; i++ {
burstyLimiter <- time.Now()
}

// 然後每隔200毫秒再向burstyLimiter傳送一個資料,這裡是不斷地
// 每隔200毫秒向burstyLimiter傳送資料
go func() {
for t := range time.Tick(time.Millisecond * 200) {
burstyLimiter <- t
}
}()
// 這裡模擬5個請求,burstyRequests的前面3個請求會連續被處理,
// 因為burstyLimiter被先連續傳送3個資料的的緣故,而後面兩個
// 則每隔200毫秒處理一次
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())
}
}


執行結果
request 1 2014-02-21 14:20:05.2696437 +0800 CST
request 2 2014-02-21 14:20:05.4696637 +0800 CST
request 3 2014-02-21 14:20:05.6696837 +0800 CST
request 4 2014-02-21 14:20:05.8697037 +0800 CST
request 5 2014-02-21 14:20:06.0697237 +0800 CST
request 1 2014-02-21 14:20:06.0697237 +0800 CST
request 2 2014-02-21 14:20:06.0697237 +0800 CST
request 3 2014-02-21 14:20:06.0707238 +0800 CST
request 4 2014-02-21 14:20:06.2707438 +0800 CST
request 5 2014-02-21 14:20:06.4707638 +0800 CST
我們從輸出的結果上可以看出最後的5個輸出結果中,前三個的時間是連續的,而後兩個的時間是隔了200

毫秒。




網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN



網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN

相關文章