Rate Limiting

Rate Limiting은 서비스를 과부하로부터 보호하고, 공정한 리소스 사용을 보장하며, 비용을 제어하기 위해 요청 속도를 제한하는 기능입니다.

목차

개요

Rate Limiting은 다음과 같은 상황에서 필요합니다:

spinner

Rate Limiting의 목적

  1. 서비스 보호: 과부하 방지

  2. 공정성: 모든 클라이언트에게 공평한 리소스 분배

  3. 비용 제어: 외부 API 호출 비용 관리

  4. 보안: DDoS 공격 방어

Rate Limiting 유형

1. 로컬 Rate Limiting

특징:

  • 각 Envoy 프록시가 독립적으로 제한

  • 빠른 응답 (추가 네트워크 호출 없음)

  • 분산 환경에서는 전체 제한이 각 인스턴스별로 적용

2. 글로벌 Rate Limiting

특징:

  • 중앙 집중식 Rate Limit 서버 사용

  • 정확한 전체 제한 (모든 인스턴스 공유)

  • 약간의 지연 발생 (외부 서비스 호출)

비교

특성
로컬 Rate Limiting
글로벌 Rate Limiting

정확도

낮음 (인스턴스별)

높음 (전체)

성능

매우 빠름

약간 느림

복잡도

낮음

높음 (외부 서비스 필요)

사용 사례

일반적인 보호

정확한 제한 필요 시

로컬 Rate Limiting

Token Bucket 알고리즘

spinner

기본 설정

주요 파라미터:

  • max_tokens: 버킷에 저장할 수 있는 최대 토큰 수 (버스트 허용)

  • tokens_per_fill: 매 fill_interval마다 추가할 토큰 수

  • fill_interval: 토큰 추가 주기

예시:

경로별 Rate Limiting

헤더 기반 Rate Limiting

글로벌 Rate Limiting

글로벌 Rate Limiting은 중앙 집중식 Rate Limit 서비스를 사용하여 클러스터 전체에 걸쳐 정확한 속도 제한을 적용합니다.

아키텍처

spinner

구성 방법

글로벌 Rate Limiting은 외부 Rate Limit 서비스를 배포하고 EnvoyFilter로 연동합니다.

1. Rate Limit Service 배포

참고: Istio는 envoyproxy/ratelimitarrow-up-right 서비스를 외부 의존성으로 사용합니다.

2. EnvoyFilter로 글로벌 Rate Limiting 구성

3. VirtualService에 Rate Limit 액션 추가

주요 파라미터 설명

파라미터
설명

domain

Rate Limit Service 구성 도메인 (ConfigMap과 일치해야 함)

failure_mode_deny

Rate Limit Service 실패 시 요청 거부 여부

timeout

Rate Limit Service 응답 대기 시간

rate_limit_service

외부 Rate Limit Service의 gRPC 엔드포인트

글로벌 vs 로컬 Rate Limiting 선택 기준

로컬 Rate Limiting 사용:

  • ✅ 간단한 구성

  • ✅ 빠른 응답 속도

  • ✅ 외부 의존성 없음

  • ❌ 파드별 제한 (전체 제한 부정확)

글로벌 Rate Limiting 사용:

  • ✅ 정확한 전체 제한

  • ✅ 복잡한 규칙 (사용자별, IP별, 경로별)

  • ✅ 중앙 집중식 관리

  • ❌ 외부 서비스 필요 (복잡도 증가)

  • ❌ 약간의 지연 (gRPC 호출)

권장 사항:

  • 프로덕션 API Gateway: 글로벌 Rate Limiting (정확한 제어 필요)

  • 마이크로서비스 보호: 로컬 Rate Limiting (빠른 응답)

  • 하이브리드: Gateway는 글로벌, 내부 서비스는 로컬

실전 예제

예제 1: API Gateway Rate Limiting

예제 2: 사용자 등급별 Rate Limiting

예제 3: 외부 API 보호

모니터링

Prometheus 메트릭

Grafana 대시보드

문제 해결

Rate Limiting이 작동하지 않음

글로벌 Rate Limiting 연결 실패

참고 자료

마지막 업데이트