피드로 돌아가기
Dev.toBackend
원문 읽기
Atomic Lua Script 도입을 통한 분산 환경 Rate Limit 오차 0% 달성
Your Python rate limiter is lying to you the moment you add a second server
AI 요약
Context
단일 프로세스 기반 In-memory Token Bucket 구조로 인한 분산 서버 환경에서의 Limit 수치 증폭 문제 발생. Redis를 통한 상태 공유 시에도 Read-Modify-Write 패턴에 따른 Race Condition으로 인해 실제 허용 요청 수가 설정값을 초과하는 설계 결함 노출.
Technical Solution
- 분산 서버 간 상태 동기화를 위해 공유 저장소인 Redis 도입
- Read-Modify-Write 사이의 간극을 제거하기 위한 Lua Script 기반 Atomic Operation 구현
- Redis 서버 내부에서 Read-Check-Spend 전 과정을 단일 트랜잭션으로 처리하여 원자성 보장
- 서버별 클록 드리프트로 인한 시간 불일치 해결을 위해 Redis TIME 명령어로 기준 시간 단일화
- Redis 장애 시 시스템 보호를 위한 Fail Closed 또는 서비스 지속을 위한 Fail Open 전략의 명시적 정의
실천 포인트
1. 분산 환경 Rate Limiter 설계 시 인스턴스 수만큼 Limit가 배수 증가하는지 검토
2. 공유 저장소 접근 시 Read와 Write 사이의 Race Condition 가능성 분석
3. 원자성 보장이 필요한 로직의 경우 Redis Lua Script나 DB Transaction 적용 여부 확인
4. 분산 노드 간 시간 동기화 전략(NTP 또는 Centralized Time Source) 수립