이 글은 책을 보고 배운 내용을 요약합니다. 자세한 설명은 생략되어 있기 때문에 책을 직접 구입해서 보시길 바랍니다.
처리율 제한 장치의 설계
처리율 제한 장치란 서버로 들어오는 요청의 갯수를 제한하는 장치를 의미한다. 예를 들어 다음과 같은 상황을 만들 수 있다.
- 사용자는 초당 2회 이상 새 글을 올릴 수 없다.
- 같은 IP 주소로는 하루에 10개 이상의 계정을 생성할 수 없다.
- 같은 디바이스로는 주당 5회 이상 리워드를 요청할 수 없다.
처리율 제한 장치는 다음과 같은 장점을 가진다.
- DDoS 공격을 방지할 수 있다.
- 비용적인면에서 활용할 수 있다.
- 우선 순위가 높은 API의 요청을 위해 자원을 사용할 수 있다.
- 과금을 통해 API 요청을 제한할 수 있다.
- 서버 과부하를 방지할 수 있다.
1단계 : 문제 이해 및 설계 범위 확정
책에서 소개된 요구사항을 정리하면 다음과 같다.
- 설정된 처리율을 초과하는 요청은 정확하게 제한함.
- 처리율 제한 장치에 의해 HTTP 응답시간에 영향이 가면 안됨.
- 가능한 한 적은 메모리를 써야 함.
- 하나의 처리율 제한 장치를 여러 서버나 프로세스에서 공유할 수 있어야 함.
- 요청이 제한되었을 때 사용자에게 제한된 사실을 알려줘야 함.
- 제한 장치에 장애가 생기더라도 전체 시스템에 영향을 주어서는 안됨.
2단계 : 개략적 설계안 제시 및 동의 구하기
일반적으로 서버측에 처리율 제한 장치를 둔다. 서버 자체에 탑재할 수도 있고 미들웨어에 넣을 수도 있다. 일반적으로 클라우드 마이크로서비스의 경우 보통 API 게이트웨이에서 처리율 제한을 둔다.
API 게이트의 대표적인 역할은 다음과 같다.
- SSL 종단
- 사용자 인증
- IP 허용 목록 관리
처리율 제한 알고리즘
자세한 내용은 책을 참고하길 바란다.
- 토큰 버킷 : 버킷이라는 곳에 토큰을 채우고 현재 토큰 갯수에 따라 요청을 허용하거나 버린다.
- 누출 버킷 : 큐에 요청을 넣어두고 큐가 가득차면 들어온 요청을 버린다. 큐에 들어간 요청은 순서에 따라 처리된다.
- 고정 윈도 카운터 : 윈도(Window)라는 단위로 시간 간격으로 요청을 묶은 뒤 윈도마다의 임계치가 넘으면 요청을 버린다.
- 이동 윈도 로그
- 이동 윈도 카운터
개략적인 아키텍처
처리율 제한 알고리즘은 현재 들어온 요청의 수를 파악해서 제한한다는 것에 대해서는 공통적으로 가지고 있다. 그러면 들어온 요청의 수를 어딘가에는 저장을 해야해서 일반적으로 레디스 같은 메모리에 저장을 한다.
3단계 : 상세 설계
지금까지는 처리율 제한 규칙이 어디에 저장되고 어떻게 처리되는지를 봤다. 이제는 구체적으로 어떻게 설계하는지에 대해서 설명을 한다.
처리율 제한 장치가 사용하는 HTTP 헤더
- X-Ratelimit-Remaining : 윈도 내에 남은 처리 가능 요청 수
- X-Ratelimit-Limit : 매 윈도마다 클라이언트가 전송할 수 있는 요청의 수
- X-Ratelimit-Retry-After : 한도 제한에 걸리지 않으려면 몇 초 뒤에 요청을 다시 보내야 하는지 알림.
사용자가 너무 많은 요청을 보내면 HTTP Status Code 429(too many requests) 오류를 X-Ratelimit-Retry-After 헤더와 함께 반환하면 된다.
상세 설계
책을 확인하길 바란다.
분산 환경에서의 처리율 제한 장치의 구현
다음 두가지 문제를 해결해야한다.
- 경쟁 조건
- 동기화
경쟁 조건
경쟁 조건이란 서로 다른 스레드에서 저장하지 않은 상태에서 카운터 값을 키우는 경우를 말한다. 경쟁 조건 문제를 해결하는 가장 일반적이 해결 방법은 락이다. 락은 시스템의 성능 저하시키는 문제가 있기 때문에 다른 두가지 방법을 사용할 수도 있다.
- 루아 스크립트
- 레디스 자료구조의 정렬 집합
동기화 이슈
동기화를 위해 선택할 수 있는 방법은 다음과 같이 있다.
- 고정 세션 : 클라이언트에 대해서 처리율 제한 장치를 고정하는 방식이다.
- 중앙 집중형 데이터 저장소 : 레디스 같은 저장소를 사용하는 것이다.
성능 최적화
데이터 센터를 지리적으로 여러 곳에 두는 것이 좋다.
데이터를 동기화 할 때 최종 일관성 모델을 사용하자(책의 6장 참고)
모니터링
효과적으로 동작하고 있는지 데이터를 모을 필요가 있다. 모니터링을 통해 확안하는 것은 다음과 같다.
- 채틱된 처리율 제한 알고리즘이 효과적이다.
- 정의한 처리율 제한 규칙이 효과적이다.
마무리
알고리즘 외에도 다음에 대해서 고민해볼 수 있다.
- 경성 또는 연성 처리율 제한
- 다양한 계층에서의 처리율 제한
- 처리율 제한을 회피하는 방법
Uploaded by Notion2Tistory v1.1.0