A Comparative Survey of API Rate-Limiting Algorithms: Token Bucket, Leaky Bucket, and Sliding Window
이 논문은 널리 사용되는 다섯 가지 API 속도 제한 알고리즘인 토큰 버킷, 리키 버킷, 고정 윈도우, 슬라이딩 윈도우 로그, 슬라이딩 윈도우 카운터를 조사하고 실험적으로 비교하여, 버스트 허용량과 정밀도 측면에서의 트레이드오프를 평가함으로써, 궁극적으로 특정 트래픽 특성 및 시스템 제약 조건에 따라 가장 적절한 알고리즘을 선택하기 위한 지침을 제공한다.
원본 논문은 CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
현대적인 디지털 서비스는 가용성과 보호 사이의 섬세한 균형에 의존합니다. 수백만 명의 사람들이 동시에 웹사이트나 애플리케이션에 접속하려고 할 때, 배후의 서버들은 갑작스러운 교통량 증가로 인해 막혀버린 단선 교량처럼 과부하 상태가 될 수 있습니다. 이러한 붕괴를 방지하기 위해 엔지니어들은 게이트키퍼 역할을 하는 '레이트 리미팅(rate limiting, 속도 제한)'이라는 메커니즘을 사용합니다. 이 게이트키퍼는 특정 사용자나 장치가 일정 기간 내에 보내는 요청 횟수를 계산하고, 안전한 임계값을 초과하는 요청은 차단합니다. 이 목표는 사용자를 처벌하려는 것이 아니라, 소수의 헤비 유저가 모든 가용 자원을 소비하는 것을 방지하여 시스템이 모두를 위해 안정적으로 유지되도록 하는 것입니다. 그러나 모든 트래픽이 일정한 흐름으로 도착하는 것은 아닙니다. 때로는 인기 있는 뉴스가 터지거나 시스템이 실패한 연결을 재시도할 때처럼 갑작스럽고 날카로운 폭발적 증가(burst)가 발생하기도 합니다. 엔지니어들의 과제는 이러한 폭발적 증가를 어떻게 처리할지 결정하는 것입니다. 즉, 시스템이 일시적인 급증을 통과하도록 허용할 것인지, 아니면 상황에 관계없이 엄격하게 고정된 제한을 적용할 것인지 결정해야 합니다.
우마이르 살림(Umair Saleem)의 최근 연구는 이러한 디지털 게이트키퍼를 구축하는 데 사용되는 다양한 수학적 규칙들을 조사합니다. 이 연구는 업계에서 흔히 사용되는 다섯 가지 특정 방법인 토큰 버킷(token bucket), 리키 버킷(leaky bucket), 고정 윈도우 카운터(fixed window counter), 슬라이딩 윈도우 로그(sliding window log), 그리고 슬라이딩 윈도우 카운터(sliding window counter)에 초점을 맞춥니다. 각 방법은 시간과 요청을 추적하는 방식이 다르며, 이는 트래픽 급증 시 서로 다른 동작을 유발합니다. 어떤 방법이 가장 효과적인지 이해하기 위해 저자는 이론에만 의존하지 않고, 동일한 조건 하에서 이들을 모두 테스트하기 위한 컴퓨터 시뮬레이션을 구축했습니다. 시뮬레이션은 100초 동안 1,000개 이상의 요청이 발생하는 현실적인 트래픽 흐름을 생성했습니다. 이 흐름은 초당 8개의 요청이 흐르는 꾸준한 배경 흐름에, 두 번의 뚜렷한 활동 폭발이 더해진 형태였습니다. 첫 번째는 5초 동안 트래픽이 초당 40개로 급증하는 구간이었고, 이어서 초당 60개에 달하는 더 날카로운 2초간의 스파이크가 발생했습니다. 이와 동일한 트래픽 패턴을 다섯 가지 알고리즘에 각각 실행함으로써, 연구는 각 방법이 얼마나 많은 요청을 수락하고 거절했는지, 그리고 스파이크 상황에서 시스템이 어떻게 작동했는지를 정확히 측정할 수 있었습니다.
결과는 이러한 알고리즘들이 트래픽 급증의 압력을 처리하는 방식에서 명확한 차이를 보였음을 드러냈습니다. 토큰 버킷과 리키 버킷은 단순히 요청의 수락 또는 거절을 결정하는 용도로 사용되었을 때 거의 동일한 방식으로 작동했습니다. 두 방법 모두 다른 방법들보다 시스템이 폭발적 증가를 더 효과적으로 흡수할 수 있도록 하여, 총 1,057개의 요청 중 844개를 수락했으며, 이는 약 80%의 수락률로 나타났습니다. 첫 번째 주요 폭발 구간 동안 이 두 방법은 69개의 요청을 통과시켰고, 두 번째의 더 날카로운 폭발 구간 동안에는 38개의 요청을 통과시켰습니다. 이는 이 알고리즘들이 미래에 사용할 수 있는 '여분의' 권한을 저장하는 내장된 용량을 갖추도록 설계되어 있어, 사용자를 즉시 거절하지 않고도 스파이크를 완화할 수 있기 때문입니다. 반면, 슬라이딩 윈도우 로그는 모든 방법 중 가장 경직된 모습을 보였습니다. 이 방법은 단 1초 내에 10개 이상의 요청이 통과하는 것을 결코 허용하지 않았으며, 설정된 제한을 엄격히 준-수했습니다. 이는 과부하에 대한 가장 정밀한 보호를 제공했지만, 높은 대가를 치렀습니다. 즉, 전체 트래픽 중 가장 많은 양을 거절하여 67.9%의 요청만을 수락했습니다. 이 방법은 시스템이 제한치를 넘는 스파이크를 절대 경험하지 않도록 보장하는 유일한 방법이었지만, 그 과정에서 다른 방법들보다 정당한 사용자들을 더 자주 돌려보냈습니다.
나머지 세 가지 방법은 시간을 측정하는 방식에 따른 예측 가능한 결함을 보이며 중간 정도의 성능을 나타냈습니다. 매 초의 시작점에서 카운터를 재설정하는 고정 윈도우 카운터는 경계 지점에서의 타이밍 오류로 인해 문제를 겪었습니다. 이 방법은 트래픽 폭발이 도착하는 순간 카운터를 재설정할 수 있었기 때문에, 의도된 제한보다 높은 최대 15개의 요청을 단 1초 내에 허용했습니다. 슬라이딩 윈도우 카운터는 이전 초(second)까지 고려하여 이를 수정하려 했으나, 최대 13개의 요청까지 치솟는 등 문제를 부분적으로만 해결했습니다. 연구 결과, 알고리즘의 선택은 전적으로 시스템이 무엇을 보호하고자 하는지에 달려 있습니다. 만약 페이지가 여러 데이터 호출과 함께 새로고침되는 것과 같은 자연스러운 활동의 폭발을 허용하여 사용자를 만족시키는 것이 목표라면, 높은 수락률과 안정적인 성능의 균형을 맞추는 토큰 버킷이 최상의 선택입니다. 만약 어떤 스파이크도 용납할 수 없는 취약한 다운스트림 시스템을 보호하는 것이 목표라면, 수락률은 낮더라도 슬라이딩 윈도우 로그가 더 나은 옵션입니다. 연구는 모든 작업에 적합한 단 하나의 완벽한 도구는 없으며, 대신 엔지니어는 트래픽 스파이크에 대한 허용 오차와 가용 메모리 자원에 부합하는 방법을 선택해야 한다고 결론짓습니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.