티스토리 뷰

Server

API Throttling 에 대해서

니용 2021. 6. 17. 22:22
반응형

API Throttling

[가설] 기본적으로 API Gateway에서는 안정적인 상태 요청 속도를 10,000rps(초당 요청수)로 제한하고, API에 대해 버스트(즉, 최대 버킷 크기)를 5,000 요청으로 제한한다. API Gateway에서 버스트 한도는 API Gateway에서 429 Too Many Requests 오류 응답을 반환하지 않고, 정상적으로 이행할 수 있는 최대 동시 요청 제출 수이다.

[CASE 1] 호출자가 1초 동안 균등하게 10,000개의 요청을 제출하면(예를 들어 1밀리초마다 10개 요청), API Gateway는 어떤것도 삭제하지 않고 모든 요청을 처리.

 

[CASE 2] 호출자가 첫 밀리초내에 10,000개 요청을 제출하면 API Gateway는 1초 내에 이 요청 중 5,000개를 처리하고 나머지 요청을 조절.

 

[CASE 3] 호출자가 첫 밀리초내에 5,000개 요청을 제출한 후, 남은 999밀리초 동안 5,000개 요청을 균등하게 분산해 제출하면(예를 들어 1밀리초마다 약 5개 요청), API Gateway는 429 Too Many Requests 오류 응답을 반환하지 않고 1초 동안 전체 10,000개 요청을 처리한다.

 

[CASE 4] 호출자가 첫 밀리초 내에 5,000개 요청을 제출하고 101번째 밀리초에 나머지 5,000개 요청을 제출하면, API Gateway는 이 1초 내에 6,000개 요청을 처리하고 나머지 요청을 조절합니다. 왜냐하면 API Gateway는 10,000rps의 속도로 첫 100밀리초가 지난 후 1,000개 요청을 처리하여 동일한 용량만큼 버킷을 비웠기 때문이다. 다음의 5,000개 요청 스파이크 중에서 1,000개 요청이 버킷을 채우고, 처리 대기 상태에 놓입니다. 나머지 4,000개 요청은 버킷 용량을 초과하므로 무시됩니다.

 

[CASE 5] 호출자가 첫 밀리초 내에 5,000개 요청을 제출하고 101번째 밀리초에 1,000개 요청을 제출한 후 남은 8999밀리초 동안 4,000개 요청을 균등하게 분산해 제출하면 API Gateway는 조절없이 1초 동안 전체 10,000개 요청을 처리한다.

 

토큰버킷 알고리즘 - API 처리 계통도

 

일반적으로, 지정된 순간에 버킷에 b가 포함되어있고 최대 버킷 용량이 B일 경우 버킷에 추가될 수 있는 최대 추가 토큰 수는 Δ=B-b이다. 이 최대 추가 토큰수는 클라이언트가 429 오류 응답을 수신하지 않고 제출할 수 있는 최대 추가 동시 요청 수에 해당한다. 일반적으로 Δ는 시간에 따라 다른다. 값의 범위는 0(버킷이 가득찬 상태, b=B)부터 B(버킷이 비어있는 상태, b=0)까지 이다. 범위는 요청 처리 속도(버킷에서 토큰이 제거되는 속도)와 속도 한도 속도(버킷에 토큰이 추가되는 속도)에 따라 달라진다.

실제 서비스에서 스로틀링 설정을 위한 사용량 계획은 어떻게 세우면 좋을까?

 

톰캣 MaxThreadCount의 개수가 500개인데, 500개 이상의 동시 요청이 들어오면, 클라이언트에서는 Connection을 맺지 못하여, Timeout이 될때까지 기다리다 한참 뒤에 실패응답을 받게 된다. 이런 경우, 스로틀링 설정을 500개로 지정하여, 현재 활성화된 요청 큐의 수를 제한하는 스로틀링 설정이 도움될 수 있다.

 

요청수 서버 처리 한도를 넘어섰을때, 클라이언트로 바로 429 에러응답을 주면, 초과 요청을 제출한 클라이언트도 빠른 실패 응답을 받을 수 있어, 실패에 대한 대응을 빠르게 처리할 수 있다. 더불어, 요청 쓰레드가 밀려서 전체 사용자 응답이 느려지는것을 방지할 수 있다.



출처: https://12bme.tistory.com/504 [길은 가면, 뒤에 있다.]

반응형
댓글
공지사항