Rate Limiter는 특정 시간 동안 허용되는 요청의 수를 제한하는 메커니즘입니다. API 서버에서 과도한 요청으로부터 시스템을 보호하고, 공정한 자원 사용을 보장하기 위해 사용됩니다.
동작 원리
핵심 파라미터
bucket_size: 버킷의 최대 용량refill_rate: 토큰이 추가되는 속도 (예: 초당 10개)장점
단점
사용 사례
AWS API Gateway, Google Cloud Endpoints 등에서 사용
동작 원리
핵심 파라미터
bucket_size: 대기열의 최대 크기outflow_rate: 처리 속도 (예: 초당 5개 요청)장점
단점
Token Bucket vs Leaky Bucket
Token Bucket은 버스트를 허용하지만, Leaky Bucket은 항상 일정한 속도로만 처리합니다.
동작 원리
예시
윈도우: 14:00:00 - 14:00:59 (최대 100개 요청)
14:00:30에 이미 100개 요청이 왔다면, 14:00:59까지 모든 요청 거부
장점
단점
경계 문제 예시
13:59:30 ~ 13:59:59: 100개 요청
14:00:00 ~ 14:00:29: 100개 요청
→ 1분 내에 실제로는 200개 요청 처리됨
동작 원리
예시
윈도우 크기: 1분, 한계: 100개
현재 시간: 14:01:30
→ 14:00:30 ~ 14:01:30 사이의 모든 요청 로그를 확인
장점
단점
동작 원리
계산 공식
추정 요청 수 = (이전 윈도우 카운트 × 겹치는 시간 비율) + 현재 윈도우 카운트
예시
윈도우 크기: 1분, 현재 시간: 14:00:30
이전 윈도우(13:59:00-13:59:59): 80개 요청
현재 윈도우(14:00:00-14:00:59): 30개 요청
겹치는 시간: 30초 (50%)
추정 요청 수 = 80 × 0.5 + 30 = 70개
장점
단점
버스트 트래픽을 허용해야 하는 경우
→ Token Bucket 사용
일정한 처리율이 중요한 경우
→ Leaky Bucket 사용
간단한 구현이 필요한 경우
→ Fixed Window Counter 사용
정확한 제어가 필요하지만 메모리가 충분한 경우
→ Sliding Window Log 사용
균형잡힌 해결책이 필요한 경우
→ Sliding Window Counter 사용
정확성 높음: Sliding Window Log > Sliding Window Counter > Token Bucket > Fixed Window Counter
성능 높음: Fixed Window Counter > Sliding Window Counter > Token Bucket > Sliding Window Log
메모리 적음: Fixed Window Counter > Sliding Window Counter > Token Bucket > Sliding Window Log
중앙집중식 접근
분산 접근
In-Memory (Redis, Memcached)
Database
Rate Limiter 설계에서 가장 중요한 것은 정확성, 성능, 메모리 사용량 간의 트레이드오프를 이해하는 것입니다.
각 알고리즘은 서로 다른 철학을 가지고 있습니다:
실제 시스템에서는 종종 여러 알고리즘을 조합하거나, 상황에 따라 다른 알고리즘을 적용하는 하이브리드 접근법을 사용합니다.
예를 들어, 일반 사용자에게는 Token Bucket을, 의심스러운 트래픽에는 더 엄격한 Fixed Window Counter를 적용하는 방식입니다. 이러한 설계 사고방식이야말로 시스템 아키텍트로서 갖춰야 할 핵심 역량이라 할 수 있습니다.