Go용 Rate Limiter 라이브러리 소개
Source: Dev.to
개요
현대 백엔드 시스템에서는 Rate Limiting이 필수적입니다. 이를 적용하지 않으면 API가 남용당하고, 자원이 고갈되며, 불공정한 사용이 발생할 수 있습니다. 이 라이브러리는 Token Bucket 알고리즘을 기반으로 한, 프로덕션 수준의 스레드‑안전 레이트 리미터를 Go에 제공합니다.
토큰 버킷 알고리즘을 사용하는 이유
- 트래픽의 버스트를 제어할 수 있음
- 부드러운 요청 흐름을 제공
- 프로덕션 시스템에서 널리 사용됨
- 이해하고 구현하기 쉬움
각 클라이언트는 시간이 지남에 따라 토큰이 채워지는 버킷을 갖게 됩니다. 요청이 토큰을 소모하고, 버킷이 비게 되면 요청이 거부됩니다.
특징
- 프로덕션‑레디 & 스레드‑안전
- 버스트 지원이 포함된 Token Bucket 알고리즘
- 빠른 인‑메모리 저장소
- 상세한 레이트‑리밋 결과 제공 (남은 토큰,
Retry-After, 리셋 시간) - 광범위한 단위 테스트와 레이스 컨디션 테스트
- 오래된 엔트리를 위한 선택적 정리 기능
사용법
import (
"fmt"
"time"
"github.com/yasserelgammal/rate-limiter/limiter"
"github.com/yasserelgammal/rate-limiter/store"
)
config := limiter.Config{
Rate: 10,
Duration: time.Second,
Burst: 20,
}
store := store.NewMemoryStore(5 * time.Minute)
rateLimiter, _ := limiter.NewTokenBucket(config, store)
if rateLimiter.Allow("user123") {
fmt.Println("Request allowed")
}
몇 줄만 추가하면 프로덕션에 바로 사용할 수 있는 신뢰성 높은 레이트 리미터를 얻을 수 있습니다.
사용 사례
- REST API
- Go 마이크로서비스
- 외부 공개 서비스
- 내부 도구
- 공정하고 제어된 요청 처리가 필요한 모든 경우
라이선스 및 기여
이 프로젝트는 MIT 라이선스 하에 오픈 소스로 제공되며, 언제든지 기여를 환영합니다.
GitHub Repository – rate‑limiter
유용하다고 생각되시면 ⭐️ 를 남겨 주세요. 오픈‑소스 활동을 지원하는 데 큰 도움이 됩니다.