시스템 디자인
시스템 사례  /  트래픽 제어  /  레이트 리미터
학습 로드맵

분산 레이트 리미터 설계

요청 폭주와 서비스 남용을 막으면서, 여러 API 서버가 하나의 제한 상태를 안전하게 공유하는 구조를 설계합니다.

3분 요약
개념 이해
면접 답변
실무 확장
진도 저장 ✓
30초 핵심 요약

공유 Redis를 사용해도 토큰 확인과 차감을 나누면 여러 게이트웨이가 같은 마지막 토큰을 소비합니다. 보충·확인·차감·TTL을 한 Lua 실행으로 닫고, Redis 장애 때는 API 위험도별 장애 시 허용(fail-open)과 차단(fail-closed)을 다르게 적용합니다.

예시 목표 처리량 (설계 가정)1,200,000 req/s
판정 지연 목표 (설계 가정)P99 < 10ms
일관성 우선순위중복 허용보다 과금 보호
DESIGN DECISION · 설계 판단

토큰 확인과 차감 사이의 경쟁 조건을 어디에서 닫을 것인가?

예시 목표 처리량 1,200,000 req/s 설계 가정
판정 지연 목표 P99 < 10ms 설계 가정
배포 형태 다중 API 서버 설계 가정
최종 선택

Redis Token Bucket + Lua 단일 판정 + API 등급별 장애 정책

보충량 계산·잔여 토큰 확인·차감·TTL 갱신을 한 Lua 실행으로 끝냅니다. Redis 장애 때 결제·관리 API는 fail-closed, 공개 조회는 제한된 emergency bucket을 사용합니다.

선택 이유

  • 여러 게이트웨이가 같은 마지막 토큰을 동시에 보고 초과 허용하는 경쟁 조건을 막습니다.
  • 정책 버전과 판정 결과를 함께 남겨 429 감소와 보호 대상 부하를 구분할 수 있습니다.
  • API 위험도에 따라 가용성과 보호 우선순위를 다르게 운영할 수 있습니다.
포기한 대안

GET 뒤 DECR를 분리한 공유 카운터

여러 요청이 같은 잔여 토큰을 읽어 모두 허용될 수 있습니다. 공유 저장소를 쓴다는 사실만으로 원자성이 생기지 않습니다.

감수한 단점

  • 정상 요청 경로가 Redis 지연과 장애에 의존합니다.
  • 유명 조직 키는 hot key가 되어 단일 샤드의 처리량을 제한할 수 있습니다.
  • 리전별 emergency bucket은 가용성을 얻는 대신 짧은 전역 한도 초과를 허용합니다.
01 · REQUIREMENTS

무엇을 제한할 것인가?

# 요구사항

사용자, API Key, IP, 조직, 엔드포인트별로 서로 다른 정책을 적용하고, 제한 판정은 애플리케이션 요청보다 먼저 끝나야 합니다.

F1다중 정책

사용자·조직·API별 제한량과 윈도우를 설정합니다.

F2빠른 판정

정상 요청 경로에 추가되는 지연을 최소화합니다.

F3분산 공유

여러 서버가 동일한 사용량 상태를 확인합니다.

F4정확한 응답

429와 남은 횟수·재시도 시각을 전달합니다.

02 · HIGH-LEVEL DESIGN

고수준 아키텍처

# 아키텍처

요청은 Gateway에서 인증된 뒤 레이트 리미터로 전달됩니다. 정책과 사용량은 분리해 캐시하며, 판정 결과와 오류율은 관측 시스템으로 전송합니다.

분산 레이트 리미터 · 요청 판정 흐름 SVG DIAGRAM · 확대 가능
분산 레이트 리미터 요청 판정 아키텍처클라이언트 요청이 API Gateway, Rate Limiter, Redis Cluster를 거쳐 허용된 요청만 애플리케이션으로 전달되고 관측 시스템에 기록되는 흐름이다.
ClientWeb · Mobile · SDK
API Gateway인증 · 정책 키 추출
Rate Limiter정책 조회 · 토큰 차감 · 429 응답
Token BucketLua Script
Redis Cluster공유 카운터 · 정책 캐시
Application허용된 요청 처리
Observability허용률 · 거부율 · P99
설계 포인트 — Redis 장애 시 모든 요청을 차단할지(Fail Closed), 임시로 허용할지(Fail Open)는 API의 위험도와 비용 구조에 따라 정책별로 결정합니다.
03 · REQUEST FLOW

요청은 어떻게 판정되는가?

# 처리 흐름
1제한 키 생성

userId + endpoint + policyVersion으로 키를 만듭니다.

2정책 조회

로컬 캐시에서 용량과 보충률을 확인합니다.

3원자적 차감

Lua Script로 토큰 확인과 감소를 한 번에 수행합니다.

4응답·관측

허용 또는 429를 반환하고 메트릭을 기록합니다.

04 · ALGORITHM

알고리즘 비교

# 트레이드오프

서비스 특성에 따라 버스트 허용 여부와 메모리 비용이 달라집니다. 기본안은 Token Bucket이며, 엄격한 균등 처리에는 Leaky Bucket을 고려합니다.

알고리즘
버스트 허용
메모리
추천 상황
Token Bucket
가능
낮음
일반 API · 모바일 트래픽
Leaky Bucket
제한적
낮음
균등한 처리량이 중요한 큐
Fixed Window Counter
창 경계 취약
낮음
단순·대규모 정책
Sliding Window Log
정확
높음
소규모·정확성 우선 정책
Sliding Window Counter
근사
중간
대규모·정확도와 비용 균형
05 · FAILURE MODES

장애 시나리오와 대응

# 장애 대응
!Redis 타임아웃

공유 카운터를 읽지 못해 모든 요청 판정이 지연됩니다.

대응 · 로컬 Emergency Bucket + 정책별 Fail Open/Closed
중복 요청

클라이언트 재시도로 동일한 비즈니스 요청이 여러 번 전달됩니다.

대응 · 제한 판정과 업무 멱등 키를 별도 관리
Hot Key

단일 유명 API Key에 트래픽이 집중되어 한 샤드가 과부하됩니다.

대응 · 키 분할, 로컬 선차감, 비동기 합산
리전 단절

리전 간 상태 동기화가 끊겨 전역 제한량이 초과될 수 있습니다.

대응 · 리전별 예산 할당 + 여유분 중앙 조정
06 · OPERATIONS

보안·관측·비용·출처

# 운영
영역
확인할 것
판단 기준
주의점
보안
제한 키·정책 변경 권한
개인정보 원문 대신 내부 ID 사용
fail-open은 공격 표면 확대
관측
허용률·429·Redis p99·hot key
정책 버전별 비교
429 감소만으로 정상 판단 금지
비용
키 수·TTL·복제·알고리즘
Fixed Window는 키당 카운터 비용이 낮음
정밀한 전역 제한은 리전 비용 증가
출처
검토일 2026-08-29
RateLimit 헤더 draft는 확정 RFC가 아님
면접 모드 · 추가 질문05:00
“전 세계 사용자에게 하나의 전역 제한량을 정확히 적용해야 한다면 지연 시간과 일관성을 어떻게 조정하시겠습니까?”
답변 구조 보기 4단계
  1. 제한 대상과 과금·보안 위험도를 먼저 분리한다.
  2. 키 설계, 알고리즘, 공유 저장소의 원자성 경계를 설명한다.
  3. Redis 장애 때 API별 fail-open/fail-closed를 결정한다.
  4. Hot key·리전 단절·업무 멱등성까지 운영 지표와 함께 답한다. 이번 선택: 일반 API는 공유 Redis token bucket과 Lua 원자 차감을 사용한다. 깨지는 신호: 저장소 p99, hot key 비율, 허용 초과율이 함께 상승한다. 다음 검증: 프로모션 버스트와 Redis timeout을 주입해 API 등급별 fail-open/fail-closed가 약속대로 갈리는지 확인한다.
INTERVIEW ↔ PRACTICE · 면접과 실무의 차이

마지막 토큰 경쟁과 Redis 장애를 한 판정 흐름으로 설명하기

INTERVIEW · 면접

알고리즘 이름보다 원자 경계와 장애 정책을 먼저 답합니다.

  • GET·DECR 분리에서 마지막 토큰이 중복 소비되는 race를 설명합니다.
  • Lua 안의 보충·확인·차감·TTL 갱신 순서를 답합니다.
  • 공개 조회와 결제 API의 fail-open·fail-closed를 분리합니다.
PRACTICE · 실무

프로모션 버스트와 저장소 timeout에서 초과 허용량을 계측합니다.

  • 허용 초과율·Redis p99·hot key를 정책 버전별로 관측합니다.
  • emergency bucket 예산과 자동 해제 조건을 검증합니다.
  • 업무 멱등성이 레이트 제한과 별도인지 회귀 시험합니다.
NEXT CASE STUDY분산 Key-Value Store 설계
EDITORIAL NOTES

작성·검토·참고 자료

콘텐츠 원칙
이 문서는 독립적으로 재작성한 한국어 학습 자료입니다. 사실과 학습용 설계 가정을 구분합니다.
작성·기술 검수
프로젝트 운영자가 직접 작성·기술 검토했습니다. 주제별 공식·1차 자료와 명시적인 설계 가정을 확인하며, 독립적인 제3자 검수가 아닙니다. 경력 범위와 검수 원칙 보기
최종 검토
예상 학습 시간
18분

참고 자료

  • RFC 6585: Additional HTTP Status Codes — 429 Too Many Requests 응답의 의미를 검토했다.
  • Redis: Scripting with Lua — 여러 연산을 원자적으로 실행하는 Redis 스크립트의 경계를 검토했다.
  • IETF HTTPAPI RateLimit header fields draft — RateLimit 정책/잔여 한도 헤더의 최신 표준화 진행 상태를 확인했다. 이는 현재 Internet-Draft이며 확정 RFC로 가정하지 않는다.
  • 본 문서의 처리량·지연·비용 수치는 설계 가정 또는 계산 결과이며 제품 사실이 아니다.

사실 오류·출처 정정은 문의·정정 페이지로 알려 주세요.