개발자
류준열

429에러와 토큰버킷알고리즘

429에러는 요청을 너무 많이 보냈을때 만날 수 있는 에러다.

429에러

써드파티 라이브러리에 의존하여 작업을 하다보면 지나치게 낮은 request limit때문에 빈번하게 429 에러를 만날 수 있다.
전 회사에서는 노션API로 랜딩페이지 SSR을 했었는데, 초당 3번의 요청을 날리면 429에러가 나는 api였다.(노션 api 문서)

새로고침 할 때마다 429 에러가 뜨고 정상화 될 때 까지 기다려야 하다 보니, 개발 생산성이 급격히 떨어지게 되었고 토큰 버킷 알고리즘으로 request limit에 도달하기 직전에 요청을 지연시켜서 해결한 사례가 있다.

그 이후 429 에러 = 토큰 버킷 알고리즘 이라는 공식이 머리속에 새겨졌는데 퇴사 후 토이 프로젝트에서 1분에 5번 요청을 보내면 429에러를 주는 api를 사용하게 되었고 토큰 버킷 알고리즘을 적용해보았다.

토큰 버킷 알고리즘이란?

버킷 = 양동이 양동이에 토큰을 담다가, 담을만큼 담으면 비워내고 일정시간동안 sleep을 주는 것이다.

토큰버킷알고리즘 (출처: https://dreamtopia.tistory.com/2)

만드는 법

큰 줄기를 다음과 같이 잡고 디테일은 각자의 상황에 맞춰서 조절하면 된다. 이해만 하고 있으면 chatGPT를 이용해서 쉽게 만들 수 있다.

뉴욕타임즈 기사 검색 api를 통해서 예시를 들어보자.

  1. 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번 이다.

  2. 요청을 보낼때마다 count를 +1 한다.

  3. count=4가 되면 sleep을 준다. (비동기로 이뤄지기떄문에 query는 로딩 상태이다.)

  4. 첫 request 이후 1분이 지나면 sleep을 풀어준다.

  5. 2~4 반복

위 방법대로 코드를 작성했을때, 다음과 같이 요청횟수를 기록하고 limit 직전에 도달하면 sleep을 주었다. 토큰버킷알고리즘 적용한 모습

꼭 429에러를 방지해야할까?

만약 429에러 이후 정상화되는 것을 기다리는게 토큰 리셋시간보다 짧다면 그냥 429 에러를 받아도 될 것 같다.