공개 API를 하나 운영하게 됐는데 특정 클라이언트가 초당 수백 번씩 때려서 서버가 휘청거리는 일이 생겼습니다. 그래서 rate limiting을 넣으려고 자료를 찾는 중인데, 알고리즘이 크게 토큰 버킷이랑 리키 버킷 두 갈래로 나뉘더라고요. 개념은 대충 읽었는데 실제로 뭘 골라야 할지 감이 안 잡혀서 여쭤봅니다.


제가 정리한 건 이렇습니다. 토큰 버킷은 버킷에 초당 N개씩 토큰을 채워두고, 요청이 올 때마다 토큰을 하나씩 소비하는 방식. 토큰이 쌓여 있으면 순간적으로 몰아서 처리(버스트)하는 것도 버킷 크기만큼은 허용된다. 반면 리키 버킷은 요청을 큐에 담아놓고 물이 새듯이 고정된 속도로 하나씩 빼서 처리하니까 버스트가 평탄화된다. 이렇게 이해했어요.


// 토큰 버킷 대략
capacity = 10 // 최대 버스트
refill = 5 per sec // 초당 5개 충전
if (tokens >= 1) { tokens -= 1; allow(); }
else { reject(429); }


그럼 결국 사람이 쓰는 트래픽(가끔 몰리는 UI 클릭 같은 거)이나 일반 API 호출에는 버스트를 좀 봐주는 토큰 버킷이 낫고, 뒤쪽 다운스트림 서비스를 일정한 속도로 보호해야 하는 상황이면 리키 버킷이 맞는 걸까요? 둘을 섞어서 앞단은 토큰, 뒷단은 리키로 두는 구성도 흔한지 궁금합니다.