스케일 가능한 레이트 리미터 설계 알고리즘 아키텍처 분산 구현

스케일 가능한 레이트 리미터 설계 알고리즘 아키텍처 분산 구현
안내: 본 포스트의 한글 요약 및 분석 리포트는 AI 기술을 통해 자동 생성되었습니다. 정보의 정확성을 위해 하단의 [원본 논문 뷰어] 또는 ArXiv 원문을 반드시 참조하시기 바랍니다.

초록

본 논문은 고가용성·저지연·메모리 효율성을 동시에 만족하는 분산 레이트 리미터를 설계한다. 핵심은 Redis Sorted Set과 Lua 스크립트를 활용한 롤링 윈도우 알고리즘이며, 이를 Redis Cluster에 적용해 데이터 샤딩·복제를 통한 AP(가용성·분할 내성) 모델을 구현한다. 토큰 버킷·고정 윈도우와의 메모리·정밀도 비교, 규칙 관리 3계층 아키텍처, 그리고 원자성 보장을 위한 스크립트 로드·해시 기법을 상세히 제시한다.

상세 분석

이 논문은 레이트 리미팅이라는 핵심 인프라 서비스가 직면한 ‘정확도·가용성·확장성’ 삼중 딜레마를 체계적으로 해소한다. 먼저 알고리즘 레벨에서 토큰 버킷, 고정 윈도우, 롤링 윈도우를 비교한다. 토큰 버킷은 버스트 트래픽에 강하지만 전역적인 시간 동기화가 필요하고, 메모리 사용량이 요청당 토큰 수에 비례한다. 고정 윈도우는 구현이 간단하고 O(1) 연산이 가능하지만 윈도우 경계에서 급격한 초과 요청을 허용한다는 단점이 있다. 롤링 윈도우는 각 요청의 타임스탬프를 Sorted Set에 저장하고, ZREMRANGEBYSCORE 로 오래된 항목을 삭제함으로써 정확한 슬라이딩 윈도우를 제공한다. 이때 Sorted Set의 O(log N) 삽입·삭제와 O(log N + M) 범위 조회 복합 복잡도는 대규모 트래픽에서도 충분히 빠르다. 메모리 측면에서는 요청당 8바이트(스코어)만 차지해, 수백만 키를 저장해도 수십 MB 수준에 머문다.

두 번째로 원자성 보장을 위해 Lua 스크립트를 활용한다. 스크립트는 ‘정리 → 카운트 → 삽입’ 과정을 하나의 EVAL 호출로 묶어, 다중 클라이언트가 동시에 접근해도 레이스 컨디션이 발생하지 않는다. 스크립트 로드는 규칙 파라미터(용량, 윈도우 크기, 최소 인터벌 등)의 해시값을 키로 사용해 캐시하고, 규칙이 변경될 때만 새 스크립트를 로드한다. 이는 스크립트 재컴파일 비용을 최소화하고, 서비스 가용성을 유지한다.

세 번째로 시스템 아키텍처는 규칙 저장소, 스크립트 관리, 요청 처리의 3계층으로 분리한다. 규칙 저장소는 별도 Redis 인스턴스에 해시 형태로 보관해 동적 업데이트를 지원한다. 스크립트 관리 계층은 규칙 해시와 스크립트 SHA1 매핑을 유지해, 요청 시 적절한 스크립트를 빠르게 선택한다. 요청 처리 계층은 클라이언트 요청을 받아 해당 사용자·엔드포인트 키를 생성하고, 위에서 설명한 Lua 스크립트를 실행한다.

마지막으로 분산 확장성을 위해 Redis Cluster를 도입한다. 클러스터는 키 해시 슬롯을 기반으로 자동 샤딩을 수행하고, 각 샤드에 복제본을 두어 파티션 장애 시에도 읽기·쓰기가 지속된다. CAP 정리에서 본 논문은 레이트 리미팅 서비스가 ‘일시적인 일관성’보다 ‘가용성·분할 내성’이 더 중요하다고 판단, AP 모델을 선택한다. 이는 대부분의 API 사용 시 요청 재시도가 가능하다는 전제에 기반한다. 전체 설계는 1~2 ms 수준의 레이턴시를 달성하면서, 초당 수십만 건의 요청을 처리할 수 있음을 실험 결과로 제시한다.


댓글 및 학술 토론

Loading comments...

의견 남기기