리키 버킷 알고리즘의 정의
리키 버킷(Leaky Bucket) 알고리즘은 네트워크나 API 트래픽을 일정한 속도로 제어하기 위한 대표적인 트래픽 셰이핑(Traffic Shaping) 기법입니다. 이름 그대로 ‘물이 새는 양동이’를 떠올리면 이해하기 쉽습니다. 양동이에 물을 아무리 빠르게 부어도, 바닥에 뚫린 작은 구멍으로는 항상 일정한 속도로만 물이 빠져나갑니다. 여기서 물은 요청(Request)이고, 양동이는 요청을 담아두는 큐(Queue), 구멍으로 빠지는 속도는 서버가 실제로 처리하는 속도를 의미합니다.
즉 사용자가 순간적으로 요청을 몰아서 보내더라도, 시스템은 정해진 속도로만 이를 처리하도록 강제합니다. 만약 양동이 용량을 초과할 정도로 요청이 쏟아지면 그 초과분은 버려지거나(reject), 별도로 대기시키는 방식으로 처리됩니다.
동작 원리와 예시
리키 버킷의 동작 과정을 코드 레벨로 단순화하면 다음과 같은 흐름을 가집니다.
- 요청이 들어오면 먼저 큐(버킷)에 쌓인다
- 정해진 시간 간격마다 큐에서 하나씩 요청을 꺼내 처리한다 (예: 초당 5건)
- 큐가 가득 찬 상태에서 새 요청이 들어오면 거부한다
예를 들어 capacity: 10, leakRate: 5/sec로 설정했다면, 순간적으로 100개의 요청이 몰려도 큐에는 최대 10개까지만 대기하고, 매초 5개씩만 실제로 처리됩니다. 나머지 요청은 큐가 가득 찼으므로 즉시 거절됩니다. 이 과정에서 처리 속도는 트래픽이 몰리든 안 몰리든 항상 ‘초당 5건’으로 일정하게 유지된다는 점이 핵심입니다.
비슷한 개념인 토큰 버킷(Token Bucket)과 자주 비교되는데, 토큰 버킷은 순간적인 버스트 트래픽을 어느 정도 허용하는 반면, 리키 버킷은 출력 속도를 철저히 균일하게 만든다는 차이가 있습니다.
실무에서 왜 사용하는가
리키 버킷은 API 서버의 Rate Limiting, 네트워크 장비의 QoS(Quality of Service) 제어, 메시지 큐 처리 등에서 널리 쓰입니다. 갑작스러운 트래픽 폭주로 서버 리소스가 고갈되거나 다운스트림 시스템이 과부하되는 상황을 막기 위해서입니다. 예를 들어 결제 API처럼 처리 순서와 속도가 매우 중요한 서비스에서는, 요청이 몰릴 때 일정한 속도로만 처리하도록 리키 버킷을 적용해 시스템 안정성을 확보합니다. 결과적으로 사용자 입장에서는 응답이 다소 지연될 수 있지만, 서비스 전체의 장애를 예방할 수 있다는 점에서 실무에서 중요한 설계 패턴으로 자리잡고 있습니다.