From b72ebaf8438b8713556a2064b74da33f91e3b7a9 Mon Sep 17 00:00:00 2001 From: Sangeeth Sudheer Date: Mon, 29 Apr 2024 20:39:37 +0530 Subject: [PATCH] Add rate limiting --- main.go | 6 ++-- ratelimiting/ratelimiting.go | 55 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 ratelimiting/ratelimiting.go diff --git a/main.go b/main.go index aa5c9e4..a3e85d5 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,8 @@ package main // import "git.sangeeth.dev/gobyexample/timers" // import "git.sangeeth.dev/gobyexample/tickers" // import "git.sangeeth.dev/gobyexample/workerpools" -import "git.sangeeth.dev/gobyexample/waitgroups" +// import "git.sangeeth.dev/gobyexample/waitgroups" +import "git.sangeeth.dev/gobyexample/ratelimiting" func main() { // runes.Runes() @@ -29,5 +30,6 @@ func main() { // timers.Timers() // tickers.Tickers() // workerpools.WorkerPools() - waitgroups.WaitGroups() + // waitgroups.WaitGroups() + ratelimiting.RateLimiting() } diff --git a/ratelimiting/ratelimiting.go b/ratelimiting/ratelimiting.go new file mode 100644 index 0000000..6a11419 --- /dev/null +++ b/ratelimiting/ratelimiting.go @@ -0,0 +1,55 @@ +package ratelimiting + +import ( + "fmt" + "time" +) + +func basicRateLimiting() { + reqs := make(chan int, 5) + limiter := time.Tick(200 * time.Millisecond) + + for i := range 5 { + reqs <- i + } + close(reqs) + + for i := range reqs { + <-limiter + fmt.Printf("request %d at %v\n", i, time.Now()) + } +} + +func burstyRateLimiting() { + burstyLimiter := make(chan time.Time, 3) + + // Fill burstyLimiter to brim first + for range 3 { + burstyLimiter <- time.Now() + } + + go func() { + for t := range time.Tick(200 * time.Millisecond) { + burstyLimiter <- t + } + }() + + reqs := make(chan int, 5) + + for i := range 5 { + reqs <- i + } + close(reqs) + + for i := range reqs { + t := <-burstyLimiter + fmt.Printf("request %d at %v\n", i, t) + } +} + +func RateLimiting() { + fmt.Println("Demo-ing basic rate limiting") + basicRateLimiting() + fmt.Println("Demo-ing bursty rate limiting") + burstyRateLimiting() +}