데브허브 | DEVHUB | Token Bucket - Low Level Design Interview QuestionToken Bucket - Low Level Design Interview Question
- 토큰 버킷 알고리즘은 서비스 과부하 방지 및 분산 서비스 거부(DoS) 공격으로부터 시스템을 보호하는 속도 제한 메커니즘으로 활용됩니다. 🛡️
- 이 알고리즘은 고정된 용량의 버킷에 토큰이 꾸준히 채워지며, 각 들어오는 요청은 하나 이상의 토큰을 소모합니다. 토큰이 충분하면 요청이 허용되고, 부족하면 거부되거나 대기합니다. ⛽
- 실제 구현에서는 Stripe와 같이 각 사용자(user ID)마다 독립적인 토큰 버킷을 가집니다. 👤
TokenBucket 클래스는 capacity (최대 토큰 수)와 refill_rate (초당 추가되는 토큰 수)를 설정하며, 사용자별 토큰 및 마지막 리필 시간을 저장할 자료구조를 초기화합니다. ⚙️
can_request(user_id, required_tokens) 메서드는 요청에 필요한 토큰이 있는지 확인하고, 충분하다면 토큰을 차감 후 True를 반환하며, 부족하다면 False를 반환하고 토큰을 차감하지 않습니다. 🚦
available_tokens(user_id) 메서드는 현재 사용자가 보유한 정수형 토큰 수를 반환합니다. 🔢
- 내부
_refill(user_id) 메서드는 현재 시간과 마지막 리필 시간 사이의 경과 시간을 계산하여 새로운 토큰을 추가하고, 버킷 용량을 초과하지 않도록 상한을 설정합니다. ⏱️
- 여러 스레드가 동시에 버킷에 접근할 때 데이터 일관성을 보장하기 위해 락(Lock)을 사용하여 임계 영역을 보호하는 스레드 안전성을 구현합니다. 🔒
- 토큰 계산 시 발생할 수 있는 미세한 부동 소수점 반올림 오류를 방지하기 위해 작은 엡실론(epsilon) 값을 사용합니다. 🧮
- 사용자 버킷은 처음 참조될 때 지연 초기화되며, 토큰은 경과된 실제 시간에 비례하여 지속적으로 보상됩니다. ⏳