Rate Limiting과 백프레셔
알고리즘
| 알고리즘 | 동작 | 특징 |
|---|---|---|
| 고정 윈도우 | 구간별 카운트 | 단순, 경계에서 버스트 2배 |
| 슬라이딩 윈도우 | 최근 N초 기준 | 정확, 비용 높음 |
| 토큰 버킷 | 토큰 충전과 소비 | 평균 제한 + 버스트 허용 |
| Leaky bucket | 일정 속도로 유출 | 처리량 평탄화 |
초과 응답 규약
429 Too Many Requests
Retry-After: 30
한도의 기준을 먼저 정한다. 사용자, API 키, IP 중 무엇인가. IP 기준은 NAT 뒤 다수 사용자를 한 덩어리로 묶는다.
백프레셔와의 차이
- Rate limiting은 외부 유입량을 정책으로 제한한다
- 백프레셔는 내부 처리 능력을 초과한 부하를 상류로 되밀어낸다
- 수단: 큐 길이 상한, 커넥션과 스레드풀 상한, 타임아웃, 부하 차단(load shedding)
실무 포인트
- 무한 큐는 지연을 무한히 키운다. 큐를 두면 상한과 초과 시 정책을 같이 정한다
- 분산 환경의 카운터는 공유 저장소에 둔다. 인스턴스별 카운트는 실제 한도가 인스턴스 수만큼 커진다
- 서버의
Retry-After와 클라이언트의 지터 백오프는 짝이다. 한쪽만 있으면 재시도 폭주가 남는다 - 제한을 걸기 전에 어떤 트래픽이 얼마나 오는지 계측한다. 근거 없는 한도는 정상 사용자를 자른다