피드로 돌아가기
Rate Limiting at Scale: Building Fixed Window and Token Bucket in Go
Dev.toDev.to
Backend

Redis와 Lua 스크립트로 구현하는 고성능 분산 Rate Limiting 전략

Rate Limiting at Scale: Building Fixed Window and Token Bucket in Go

amogh tyagi2026년 4월 10일5intermediate

Context

분산 환경에서 다수의 동시 요청이 동일 카운터에 접근할 때 발생하는 Race Condition 문제. 단순 라이브러리 사용 시 내부 동작 원리 파악 및 트래픽 패턴별 최적 알고리즘 선택의 어려움.

Technical Solution

  • 요청 횟수 기반의 단순한 제어가 필요한 내부 서비스용 Fixed Window 알고리즘 설계
  • 버스트 트래픽 대응을 위해 토큰 충전 및 소비 개념을 도입한 Token Bucket 알고리즘 구현
  • Read-Compute-Write 과정의 원자성 보장을 위해 Redis Lua 스크립트를 활용한 단일 라운드 트립 처리
  • Fixed Window의 경계 지점 트래픽 폭주 문제를 해결하기 위해 Token Bucket의 가변적 토큰 누적 방식 채택
  • CI 환경에서 Mock 대신 실제 Redis 서비스 컨테이너를 구동하여 Lua 스크립트의 런타임 무결성 검증
  • 트래픽 예측 가능 여부에 따라 단순 구조의 Fixed Window와 유연한 Token Bucket을 구분하여 적용하는 전략

Key Takeaway

분산 시스템의 상태 업데이트 시 네트워크 왕복 횟수를 줄이고 원자성을 확보하는 Lua 스크립트 활용의 중요성. 서비스의 트래픽 패턴(균등 분산 vs 버스트)에 맞는 알고리즘 선택이 시스템 안정성을 결정하는 핵심 요소.


공개 API 설계 시에는 버스트 트래픽 대응이 가능한 Token Bucket을 기본값으로 선택하고, Redis Lua 스크립트로 원자적 연산을 구현할 것

원문 읽기