django throttling
django throttling
-
Throttle 이란 특정 조건 하에 최대 호출 회수를 결정하는 클래스
-
여러 이유로 지정 기간 내에 호출 횟수를 제한하는 것
Rate
rate 는 지정 기간 내의 최대 호출 횟수를 말한다.
표기하는 방법은 {숫자}/{간격} 다음과 같이 표기한다.
여기서 숫자는 지정 간격 내의 최대 요청 제한 횟수를 말하고, 간격은 횟수를 초기화하는 시간을 말한다.
이 때 간격은 문자의 맨 앞글자만을 참조. 따라서 d 나 day 는 똑같이 동작함
Rates 제한 메커니즘
django 에서 제공하는 Throttle 들은 모두 SingleRateThrottle 를 상속받음.
그리고 SingleRateThrottle 는 아래의 매커니즘으로 제한을 유지함.
1. SingleRateThrottle에서는 요청한 시간의 timestamp를 list로 유지
2-1 cache 에서 timestamp list를 가져옴.
2-2 체크범위 밖의 timestamp값은 모두 버림.
2-3 timestamp list의 크기가 허용범위보다 클 경우, 요청을 거부.
2-4 timestamp list의 크기가 허용범위보다 작을 경우, 현재 timestamp를timestamp list에 추가하고, cache에 다시 저장.
Cache
매 요청시마다 cache 에서 timestamp list 값을 get/set 하므로 cache의 성능이 굉장히 중요하다.
SimpleRateThrottle에는 다음 코드와 같이 장고 디폴트 cache를 쓰도록 설정되어있음
from django.core.cache import cache as default_cache
class SimpleRateThrottle(BaseThrottle):
cache = default_cache
django 프로젝트는 디폴트로 로컬 메모리 cache를 사용하고 있어 서버가 재시작되면 캐시가 모두 초기화됨. 이 외에도 여러 cache가 있음
Memcached 서버 지원
-
django.core.cache.backends.memcached.MemcachedCache
-
django.core.cache.backends.memcached.PyLibMCCache
데이터베이스 캐시
- django.core.cache.backends.db.DataabseCache
파일 시스템 캐시
- django.core.cache.backends.filebased.FileBasedCache
로컬 메모리 캐시
- django.core.cache.backends.locmem.LocMemCache
출처 : https://ssungkang.tistory.com/entry/Django-Throttling