네트워크 시스템에서 클라이언트 또는 서비스가 보내는 트래픽의 처리율을 제어하기 위한 장치
특정기간 내에 전송되는 클라이언트의 요청 횟수를 제한한다.
API 요청 횟수가 제한 장치에 정의된 임계치를 넘어서면 추가로 도달한 모든 호출은 처리가 중단된다.
DoS 공격에 의한 자원고갈을 방지
비용 절감:
처리율 제한 장치는 여러가지 알고리즘을 사용해서 구현할 수 있고 각각 고유한 장단점을 갖기 때문에, 어떤 알고리즘을 사용해야할지 면접관과 소통하며 결정을 내려야한다.
결론난 조건
- 서버 측 제한 장치
- Ip 주소, 사용자 ID 등 다양한 형태를 정의할 수 있는 유연한 시스템이어야함.
- 대규모, 분산 환경에서 작동해야 함.
- 처리율 제한 장치를 독립된 서비스 or 어플리케이션 코드에 포함 할지는 직접 결정하라.
- 요청이 거부당한 사용자에게 그 사실을 알려야한다.
- 설정된 처리율을 초과하는 요청은 정학하게 제한 해야 한다.
- HTTP 응답에 영향을 주는 것은 곤란하다.
- 가능한 적은 메모리
- 분산형 처리율 제한
- 예외 처리
- 높은 결함 감내성
해당 미들웨어에서 API 서버로 가는 요청들을 제어한다.
만약 처리율 제한 미들웨어에 의해 요청이 가로막히면 클라이언트는 HTTP 상태코드 429(Too many requests) 를 받는다.
API 게이트웨이는 다음과 같은 역할을 한다.
마이크로서비스에 기반해 답변할 경우, 본인 설계에 API 게이트웨이가 이미 포함돼있다면 처리율 제한 기능을 API 게이트웨이에 포함시켜야 할 수도 있다.
요청이 도착하면 버킷에 충분한 토큰이 있는지 검사
알고리즘 파라미터
API 엔드포인트 마다 별도의 버킷을 두는 경우
- 사용자마다 하루에 한 번 포스팅을 하고, 친구 추가를 150명까지 할 수 있고, 좋아요 버튼은 다섯 번까지만 누를 수 있다 => 사용자마다 3개의 버킷
모든 요청이 하나의 버킷을 공유하는 경우
- 시스템의 처리율을 초당 10,000개 요청으로 제한하고 싶은 경우.
장점
단점
요청이 도착하면 큐가 가득 차있는지 확인
지정된 시간마다 큐에서 요청을 꺼내어 처리한다.
알고리즘 파라미터
장점
단점
장점
메모리 효율이 좋다.
이해하기 쉽다.
윈도가 닫히는 시점에 카운터를 초기화하는 방식은 특정한 트래픽 패턴을 처리하기에 적합하다.
단점
윈도의 경계 부근에 순간적으로 많은 트래픽이 집중될 경우 윈도에 할당된 양보다 더 많은 요청이 처리될 수 있다.
고정 1초에 10개 제한이라고 했을때
(1:00:00:00 ~ 1:00:00:90) -> 3개
(1:00:00:90 ~ 1:00:01:00) -> 5개
(1:00:01:00 ~ 1:00:01:10) -> 7개-> 할당된 양보다 더 많은 요청이 처리되버림
고정 윈도우 카운터 알고리즘의 윈도의 경계 부근에 순간적으로 많은 트래픽이 집중될 경우 윈도에 할당된 양보다 더 많은 요청이 처리될 수 있다는 문제를 해결한다.
요청의 타임스탬프를 추적한다. 타임스탬프 데이터는 보통 레디스의 정렬집합같은 캐시에 보관한다.
장점
단점
고정 윈도 카운터 알고리즘과 이동 윈도 로깅 알고리즘의 결합된 방식
시간에 따라 움직이는 윈도의 카운터 계산방법
현재 구간 요청수 + 직전 구간 요청 수 * 이동 윈도와 직전 구간 겹치는 비율
9 * 0.75 + 5 = 11.75 -> 요청 거부
카운터를 어디에 보관할 것 인가
데이터베이스는 디스크 접근 때문에 느리므로 빠르고, 시간 기반 만료 정책을 지원해주는 캐시(레디스)를 사용하자.
처리율 제한 규칙
리프트의 ratelimit(오픈소스)을 사용하여 처리율 제한 규칙을 정의할 수 있다.
domain: messaging
descriptors:
- key: message_type
value: marketing
descriptors:
- key: to_number
rate_limit:
unit: day
requests_per_unit: 5
처리할 수 있는 마케팅 메시지를 하루 최대 5개로 제한하고 있다.
처리율 규칙은 디스크에 보관
작업 프로세스는 수시로 규칙을 디스크에서 읽어 캐시에 저장
락(lock) : 시스템의 성능을 상당히 떨어뜨린다는 문제가 있다.
해결법 :
수백만 사용자를 지원하기 위해 여러 서버가 있다.
요청을 각기 다른 제한장치로 보낼 수 있기 때문에 모든 처리율 제한 장치 서버의 동기화가 필요하다.
해결책 : redis 같은 중앙 집중형 데이터 저장소를 쓰는 것.