API 게이트웨이 트래픽 통제(Rate Limiting): 토큰 버킷과 리키 버킷 모델의 알고리즘 철학
현업에서 대규모 트래픽을 다루다 보니 결국 기본기로 돌아가게 되더군요. 교과서적인 지식에 그치지 않고 실제 운영 환경에서 느낀 점을 공유합니다.
마이크로서비스 아키텍처 세계에서 API 게이트웨이(Gateway)는 외부의 무자비한 트래픽 해일로부터 내부의 여린 서비스 인스턴스들을 보호하는 거대한 댐의 역할을 수행합니다. 대규모 론칭이나 디도스(DDoS) 공격과 맞닥뜨릴 때 단일 데이터베이스 서버로 쏟아지는 연결 요청을 사전에 차단하지 못하면 도미노처럼 시스템 전체가 다운되는 장애(Cascading Failure)를 겪게 됩니다. 이를 방어하는 가장 근원적이고 수학적인 트래픽 통제 솔루션이 비율 제한, 즉 속도 제한(Rate Limiting) 아키텍처입니다. 토큰 버킷(Token Bucket) 모델은 제한된 대역폭 내에서 아주 탄력적인 제어를 달성하는 방식입니다. 개념적으로 각 유저의 IP마다 바구니(Bucket)가 주어지고, 백그라운드 스레드는 일정한 시간 주기로 이 바구니에 토큰을 차곡차곡 리필해 놓습니다. 클라이언트가 API를 호출할 때마다 토큰 하나를 꺼내며, 토큰이 고갈되면 그 즉시 429 Too Many Requests HTTP 에러 코드를 반환합니다. 이 방식은 잠깐 트래픽이 쏠리는 버스트(Burst) 상황에서 바구니에 쌓아둔 여유 토큰만큼 요청을 일시적으로 허용하기 위해 고안되었습니다.
반대로 리키 버킷(Leaky Bucket) 모델은 아무리 많은 물(트래픽)이 한꺼번에 쏟아져 들어오더라도 바구니 아래에 뚫린 작은 구멍을 통해 무조건 일정한 속도로만 물방울이 빠져나가도록 강제하는 아주 경직된 방식의 제어 구조입니다. 클라이언트가 단기적으로 폭주하는 요청을 던지면 버킷 안에 큐(Queue) 형태로 차곡히 쌓인 채 백엔드로 천천히 흘러가게 되고, 만일 버킷 용량 한계를 초과해 물이 넘치면 신규 요청을 가차 없이 드롭(Drop)해 버립니다. 이는 서비스 성능이나 대역폭의 절대적인 임계치 한계를 엄격히 묶어두고 내부 인프라의 처리 흐름을 극도로 매끄럽게 안정화시킬 때 주로 탑재되는 핵심 기반 구조입니다.
현대의 거대한 클라우드 클러스터에서는 한 대의 API 게이트웨이가 아닌 수십 대의 분산 게이트웨이가 존재하므로 특정 사용자가 초당 몇 개의 버킷을 차감했는지를 게이트웨이끼리 동기화하는 문제가 반드시 수반됩니다. 개별 게이트웨이 메모리 단위로 카운팅 하면, 10대의 게이트웨이 팜이 있을 때 초당 트래픽 제한이 원래의 10배로 우발 충돌하는 치명적 구멍이 발생합니다. 그 해결책으로 전역적으로 동기화된 초고속 in-memory 저장소인 Redis 클러스터를 활용해 루아 스크립트(Lua Script) 원자 트랜잭션을 쏘아보내 분산 환경에서도 완벽한 카운터 정합성을 보장하도록 설계하는 것이 진정한 트래픽 엔지니어링 마스터 시스템의 숨은 통치 원리입니다.