清華尹成帶你實戰GO案例(48)Go 請求處理頻率控制
Go 請求處理頻率控制
頻率控制是控制資源利用和保證服務高質量的重要機制。Go可以使用goroutine,channel和ticker來以優
雅的方式支援頻率控制。
執行結果
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
頻率控制是控制資源利用和保證服務高質量的重要機制。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
相關文章
- 清華尹成帶你實戰GO案例(24)Go 錯誤處理Go
- 清華尹成帶你實戰GO案例(61)Go 訊號處理Go
- 清華尹成帶你實戰GO案例(22)Go常量Go
- 清華尹成帶你實戰GO案例(28)Go 方法Go
- 清華尹成帶你實戰GO案例(35)Go 互斥Go
- 清華尹成帶你實戰GO案例(38)Go 介面Go
- 清華尹成帶你實戰GO案例(46)Go 排序Go排序
- 清華尹成帶你實戰GO案例(47)Go 切片Go
- 清華尹成帶你實戰GO案例(2) Go 字典Go
- 清華尹成帶你實戰GO案例(7)Go DeferGo
- 清華尹成帶你實戰GO案例(7)Go ExitGo
- 清華尹成帶你實戰GO案例(12)Go PanicGo
- 清華尹成帶你實戰GO案例(19)Go變數Go變數
- 清華尹成帶你實戰GO案例(23)Go 超時Go
- 清華尹成帶你實戰GO案例(29)Go 工作池Go
- 清華尹成帶你實戰GO案例(37)Go 集合功能Go
- 清華尹成帶你實戰GO案例(49)Go 時間Go
- 清華尹成帶你實戰GO案例(52)Go數值Go
- 清華尹成帶你實戰GO案例(54)Go 陣列Go陣列
- 清華尹成帶你實戰GO案例(57)Go通道方向Go
- 清華尹成帶你實戰GO案例(63)Go 指標Go指標
- 清華尹成帶你實戰GO案例(8)Go for迴圈Go
- 清華尹成帶你實戰GO案例(17) Go URL解析Go
- 清華尹成帶你實戰GO案例(20)Go 遍歷通道Go
- 清華尹成帶你實戰GO案例(25)Go 打點器Go
- 清華尹成帶你實戰GO案例(30)Go 關閉通道Go
- 清華尹成帶你實戰GO案例(39)Go 結構體Go結構體
- 清華尹成帶你實戰GO案例(40)Go 程式觸發Go
- 清華尹成帶你實戰GO案例(41)Go 程式執行Go
- 清華尹成帶你實戰GO案例(50)Go 時間戳Go時間戳
- 清華尹成帶你實戰GO案例(53)Go 數字解析Go
- 清華尹成帶你實戰GO案例(55)Go 隨機數Go隨機
- 清華尹成帶你實戰GO案例(58)Go通道緩衝Go
- 清華尹成帶你實戰GO案例(5)Go 自定義排序Go排序
- 清華尹成帶你實戰GO案例(10)Go JSON支援GoJSON
- 清華尹成帶你實戰GO案例(11)Go Line FiltersGoFilter
- 清華尹成帶你實戰GO案例(13)Go range函式Go函式
- 清華尹成帶你實戰GO案例(16)Go Switch語句Go