스로틀링 개념
스로틀링은 특정 기간 동안 시스템 또는 장치가 만들 수 있는 요청 수를 제한하는데 사용되는 기술입니다. 제한을 사용하는 데는 다음과 같은 몇가지 이유가 있습니다.
- 시스템 또는 네트워크의 과부하를 방지하려면 : 시스템이 한 번에 너무 많은 요청을 받으면 과부하 상태가 되어 모든 요청을 효과적으로 처리할 수 없습니다. 스로틀링은 시스템이 용량 제한 내에서 유지되도록 하는 데 도움이 됩니다.
- 악의적인 활동으로부터 보호하기 위해 : 경우에 따라 과도한 요청으로 시스템을 압도하려는 악의적인 공격에 대한 방어 수단으로 제한을 사용할 수 있습니다. 가능한 요청 수를 제한함으로써 시스템은 이러한 공격을 더 잘 견딜수 있습니다. 예를 들면 음식검색 API를 만들었는데 초당 막 1만회 요청이 들어오면 이것을 쓰로틀링을 통해 조절 할 수 있습니다.
- 리소스 활용을 최적화하려면 리소스를 효율적으로 사용하기 위해 스로틀링을 사용할 수 있습니다. 예를 들어 시스템의 대역폭이나 처리 능력이 제한된 경우 조절을 통해 이러한 리소스가 불필요하거나 중복된 요청에 낭비되지 않고 최적의 방식으로 사용되도록 할 수 있습니다.
Django에서 쓰로틀링 사용하기
DRF 쓰로틀링 개념
번역된 사이트
https://hyun-am-coding.tistory.com/entry/15-Throttling
공식문서
https://www.django-rest-framework.org/api-guide/throttling/
대표적인 3가지
UserRateThrottle, AnonRateThrottle, ScopedRateThrottle 이렇게 있습니다. 또한 Custom을 해서 사용할 수 있습니다.
- UserRateThrottle : 인증된 유저당
- AnonRateThrottle : 익명 사용자에 대한
- ScopedRateThrottle : ID or 해당 IP에대한
서비스에 적용하기
- 테스트를 위해 초당 1회만 허용하도록 하겠습니다.(에러를 확인하기 위해)
- 사용하는 throttle은 UserRateThrottle입니다.
- 사용할 뷰셋은 ObjectViewSet입니다
먼저 throttling.py라는 스로틀링을 사용하고 싶은 앱에다가 만들겠습니다.
그 후 코드는 다음과 같이 작성하겠습니다.
throttling.py
from rest_framework.throttling import UserRateThrottle
class ObjectThrottle(UserRateThrottle):
rate = "1/s"
class ObjectAnonThrottle(AnonRateThrottle):
rate = "1/s"
views.py
class ObjectViewSet(viewset.ModelViewset):
permission_classes = [AllowAny]
pagination_class = ObjectPagination
model = FoodInformation
queryset = Object.objects.all()
serializer_class = ObjectSerializer
throttle_classes = [
ObjectThrottle,
ObjectAnonThrottle
]
이런식으로 throttle_classes를 통해 Throttle를 등록할 수 있습니다.
저는 익명유저와 인증된 유저를 둘다 처리하기 위해 두 개 전부 등록했습니다.
- ObjectThrottle
- ObjectAnonThrottle
테스트 해보기
만약 스로틀링이 적용된 샘플 API를 1초에 2회이상 요청을 보낸경우 다음과 같이 1초후에 다시 요청해달라는 에러(429 Error)가 나옵니다.
'Django > Django REST framework' 카테고리의 다른 글
django Elasticsearch 사용기 - (음식 검색 개선) (0) | 2024.07.07 |
---|---|
Django 코드 품질 향상시키기(with black, isort, flake8, pre-commit, makefile) (0) | 2024.04.22 |
15. Throttling (0) | 2022.08.25 |
Sendbird를 이용한 DRF 채팅서버 구현 (0) | 2022.06.24 |
Django FCM 개발(DRF) (0) | 2022.03.01 |
댓글