개발자
류준열
429에러와 토큰버킷알고리즘
429에러는 요청을 너무 많이 보냈을때 만날 수 있는 에러다.
써드파티 라이브러리에 의존하여 작업을 하다보면 지나치게 낮은 request limit 때문에 빈번하게 429 에러를 만날 수 있다.
1분에 5번 요청을 보내면 429에러를 주는 api를 사용하게 되었고 토큰 버킷 알고리즘을 적용해보았다.
토큰 버킷 알고리즘이란?
버킷 = 양동이 양동이에 토큰을 담다가, 담을만큼 담으면 비워내고 일정시간동안 sleep을 주는 것이다.
(출처: https://dreamtopia.tistory.com/2)
만드는 법
큰 줄기를 다음과 같이 잡고 디테일은 각자의 상황에 맞춰서 조절하면 된다. 이해만 하고 있으면 chatGPT를 이용해서 쉽게 만들 수 있다.
뉴욕타임즈 기사 검색 api를 통해서 예시를 들어보자.
-
api 문서에서 rate limit에 관한 정보들을 확인한다.
New York Times api API Call limit : Yes, there are two rate limits per API: 500 requests per day and 5 requests per minute. You should sleep 12 seconds between calls to avoid hitting the per minute rate limit.
New York Times api 문서에서 확인 할 수 있는데 여기서 얻을 수 있는 정보는 하루에 500번, 분당 5번 이다.
-
요청을 보낼때마다 count를 +1 한다.
-
count=4
가 되면 sleep을 준다. (비동기로 이뤄지기떄문에 query는 로딩 상태이다.) -
첫 request 이후 1분이 지나면 sleep을 풀어준다.
-
2~4 반복
위 방법대로 코드를 작성했을때, 다음과 같이 요청횟수를 기록하고 limit 직전에 도달하면 sleep을 주었다.
꼭 429에러를 방지해야할까?
만약 429에러 이후 정상화되는 것을 기다리는게 토큰 리셋시간보다 짧다면 그냥 429 에러를 받아도 될 것 같다.