GO · 고루틴/채널
Rate Limiting
time.Ticker와 토큰 버킷으로 요청 속도를 제한합니다.
고루틴/채널고급rate-limittoken-buckettickerthrottle
핵심 설명
time.Ticker와 토큰 버킷으로 요청 속도를 제한합니다.
Go code
package main
import (
"fmt"
"time"
)
// 간단한 레이트 리미터
type RateLimiter struct {
tokens chan struct{}
ticker *time.Ticker
}
func NewRateLimiter(rate int, burst int) *RateLimiter {
rl := &RateLimiter{
tokens: make(chan struct{}, burst),
ticker: time.NewTicker(time.Second / time.Duration(rate)),
}
// 초기 토큰 채우기
for i := 0; i < burst; i++ {
rl.tokens <- struct{}{}
}
// 토큰 보충
go func() {
for range rl.ticker.C {
select {
case rl.tokens <- struct{}{}:
default: // 버킷 가득 참
}
}
}()
return rl
}
func (rl *RateLimiter) Wait() {
<-rl.tokens
}
func (rl *RateLimiter) Stop() {
rl.ticker.Stop()
}
func main() {
limiter := NewRateLimiter(5, 3) // 초당 5개, 버스트 3
defer limiter.Stop()
for i := 0; i < 8; i++ {
limiter.Wait()
fmt.Printf("[%s] 요청 %d 처리\n",
time.Now().Format("15:04:05.000"), i)
}
}학습 팁
실무에서는 golang.org/x/time/rate 패키지의 rate.Limiter를 사용하세요. 토큰 버킷 알고리즘을 정확히 구현합니다.
주의할 점
time.Ticker를 사용 후 Stop()하지 않으면 고루틴이 누수됩니다. 항상 defer ticker.Stop()을 호출하세요.
자주 묻는 질문
Rate Limiting란 무엇인가요?
time.Ticker 와 토큰 버킷으로 요청 속도를 제한합니다.
Rate Limiting 학습 시 주의할 점은 무엇인가요?
time.Ticker 를 사용 후 Stop() 하지 않으면 고루틴이 누수됩니다. 항상 defer ticker.Stop() 을 호출하세요.