PHpullh

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() 을 호출하세요.