피드로 돌아가기
Dev.toBackend
원문 읽기
Redis와 Lua 스크립트로 구현하는 고성능 분산 Rate Limiting 전략
Rate Limiting at Scale: Building Fixed Window and Token Bucket in Go
AI 요약
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 스크립트로 원자적 연산을 구현할 것