Rate Limiting
Rate Limiting
이란 중요한 메커니즘으로 자원사용량을 제한하거나 서비스의 대역폭을 제한하는 것을
의미합니다. Go
에서는 goroutine + channels + tickers
를 이용해서 쉽고 우아하게 처리할 수 있습니다.
package main
import "time"
import "fmt"
func main() {
requests := make(chan int, 5) // [1]
for i := 1; i <= 5; i++ {
requests <- i
}
close(requests)
limiter := time.Tick(time.Millisecond * 200) // [2]
for req := range requests { // [3]
<-limiter
fmt.Println("request", req, time.Now())
}
burstyLimiter := make(chan time.Time, 3) // [4]
for i := 0; i < 3; i++ { // [5]
burstyLimiter <- time.Now()
}
go func() { // [6]
for t := range time.Tick(time.Millisecond * 200) {
burstyLimiter <- t
}
}()
burstyRequests := make(chan int, 5) // [7]
for i := 1; i <= 5; i++ {
burstyRequests <- i
}
close(burstyRequests)
for req := range burstyRequests {
<-burstyLimiter
fmt.Println("request", req, time.Now())
}
}
- 먼저 기본적인 제한을 사용하겠습니다. 처리요구량을 제한하는 것입니다.
채널을 이용해서 요청을 제한하고 있습니다. limiter
채널은 0.2초마다 값을 수신하고 있습니다. 제한에 대한 기본적이 시간을 제공합니다.limiter
에서 각 요청을 제공하기 전의 메세지는 블럭상태 입니다.
0.2초마다 요청을 제한할 수 있습니다.