less than 1 minute read

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

Categories:

Updated: