From b9a9dc740d2c752a157e8348a6996e85d7a83595 Mon Sep 17 00:00:00 2001 From: Edward Date: Fri, 1 May 2020 00:16:49 +0800 Subject: [PATCH] add rate_limiting --- gomore/rate_limiting/rate_limiting.go | 53 ++++++++++++++++++++++ gomore/rate_limiting/rate_limiting_test.go | 42 +---------------- 2 files changed, 54 insertions(+), 41 deletions(-) create mode 100644 gomore/rate_limiting/rate_limiting.go diff --git a/gomore/rate_limiting/rate_limiting.go b/gomore/rate_limiting/rate_limiting.go new file mode 100644 index 0000000..451bdfd --- /dev/null +++ b/gomore/rate_limiting/rate_limiting.go @@ -0,0 +1,53 @@ +package ratelimit + +import ( + "fmt" + "time" +) + +/* + +Rate limiting is an very important mechanism +With limiting you can controll resource utilization and maintain quality of service. +Go supports rate limiting by using goroutines, channels, and tickers. +*/ + +func rateLimiting() { + + requests := make(chan int, 5) + for i := 1; i <= 5; i++ { + requests <- i + } + close(requests) + + limiter := time.Tick(200 * time.Millisecond) + + for req := range requests { + <-limiter + fmt.Println("request", req, time.Now()) + } + + //突发限流器 + burstyLimiter := make(chan time.Time, 3) + + for i := 0; i < 3; i++ { + burstyLimiter <- time.Now() + } + + go func() { + for t := range time.Tick(200 * time.Millisecond) { + burstyLimiter <- t + } + }() + + //请求队列 + 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()) + } +} diff --git a/gomore/rate_limiting/rate_limiting_test.go b/gomore/rate_limiting/rate_limiting_test.go index 57f10df..6c660ee 100644 --- a/gomore/rate_limiting/rate_limiting_test.go +++ b/gomore/rate_limiting/rate_limiting_test.go @@ -60,46 +60,6 @@ func TestRateLimiting(t *testing.T) { fmt.Println("request handled", req, time.Now()) } - rateLimiting() + //rateLimiting() } - -func rateLimiting() { - - requests := make(chan int, 5) - for i := 1; i <= 5; i++ { - requests <- i - } - close(requests) - - limiter := time.Tick(200 * time.Millisecond) - - for req := range requests { - <-limiter - fmt.Println("request", req, time.Now()) - } - - //突发限流器 - burstyLimiter := make(chan time.Time, 3) - - for i := 0; i < 3; i++ { - burstyLimiter <- time.Now() - } - - go func() { - for t := range time.Tick(200 * time.Millisecond) { - burstyLimiter <- t - } - }() - - //请求队列 - 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()) - } -}