본문 바로가기

개발자/알고리즘

토큰 버킷(Token Bucket) 알고리즘

서버를 개발하면서 많은 고민을 하는 부분 중 하나는 트래픽 처리일 거예요. 많은 유저가 사용하는 프로젝트에는 요청도 많을 수밖에 없어요. 만약, 어떤 사이트에서 엄청난 이벤트를 한다면 오픈하는 시간에 많은 유저가 그 사이트로 접속하게 되죠. 그러면 서버에서는 몰려드는 요청에 응답 속도가 느려지고, 급기야 버티지 못하고 죽는 경우도 생기게 돼요. 그래서 많은 트래픽을 처리하기 위한 대처가 필요한 거죠! 로드밸런싱을 통해 요청을 여러 서버로 분산시키거나 특정 시간 안에 제한된 요청만 받는 작업을 해야 해요. 결론은 트래픽 처리를 위한 방법으로 속도 제한(Rate Limiting)을 통해 특정 시간에 제한된 요청을 받는 알고리즘 중 하나인 토큰 버킷(Token Bucket)에 대해 소개해보려 합니다!

속도 제한(Rate Limiting)을 주는 이유

속도 제한은 혼잡 제어 기법으로 Traffic Rate를 제한하는 방법이에요. 임의로 정의한 트래픽을 초과하게 된다면 서버에서는 요청 거절을 할 수 있게 되죠.

만약 속도 제한을 주지 않는다면 어떤 일이 벌어질까요? 여러 사용자가 동시다발적으로 요청을 하게 되거나, Dos/DDos 공격을 받게 된다면 서버 과부하로 인해 다운되는 일이 발생하게 돼요. 그래서 서버에서는 부담이 되지 않고 유저의 요청에 응답할 수 있을 정도로 트래픽을 지정하고 속도를 제어하는 작업을 해야 하죠.

토큰 버킷(Token Bucket)이란

양동이 안에 토큰을 넣는다는 뜻으로, 양동이에 토큰이 있을 때만 요청을 처리하는 알고리즘이에요. 일정한 시간마다 양동이에 제어용 토큰이 생성되고, 요청이 들어온다면 양동이에 토큰이 있는지 확인하고 응답하는 방식이죠!

토큰 버킷 구조

예를 들어, 양동이에 담을 수 있는 최대 토큰이 100개이고, 1초 당 넣는 토큰이 1개라면 1초 당 처리할 수 있는 요청의 수는 1개가 돼요. 만약 100초 동안 요청이 들어오지 않았다면 양동이에는 100개의 토큰이 쌓이게 되고 이후에 들어오는 100개의 요청을 연속 처리할 수 있게 되죠. 그리고 양동이가 가득 찼다면 다음으로 생성되는 토큰은 버려져요.

요청 큐가 가득 차거나 양동이에 토큰이 없어서 요청을 거부할 땐 429 Too Many Requests를 반환해주시면 돼요.

 

'개발자 > 알고리즘' 카테고리의 다른 글

[백준] 11048번 이동하기 (Go)  (0) 2021.10.26