Foundry
처리율 제한 장치 설계
기초
핵심

요구사항 정리와 세는 기준 정하기

무엇을 기준으로 세는지가 첫 결정이다

처리율 제한 장치는 요구사항이 짧아 보여서 바로 알고리즘 이야기로 넘어가기 쉽습니다. 그런데 무엇을 기준으로 세는지얼마나 정확해야 하는지를 정하지 않으면 어떤 알고리즘도 고를 수 없습니다.

항목
대상공개 API 게이트웨이
피크 트래픽초당 5만 요청
게이트웨이20대
한도API 키마다 분당 1,000회
판정에 쓸 수 있는 시간1ms 이내
허용 오차한도의 5퍼센트 까지

기능 요구사항과 범위 밖

구분내용
이번에 만든다한도 판정, 초과 응답, 남은 횟수 알려주기, 키마다 다른 한도, 무거운 호출을 더 크게 세기
범위 밖과금, 봇 탐지, 대규모 공격 방어, 인증 자체

범위 밖을 말하는 것이 중요합니다. 대규모 공격 방어를 여기서 하려 하면 판정 하나에 붙는 비용이 커지고, 정작 정상 사용자의 한도 판정이 느려집니다. 공격 방어는 더 앞단에서 값싸게 자르는 별개의 일입니다.

어디서 세고 어디서 자르나

게이트웨이 20대가 공유 카운터를 보고 통과와 거절을 판정하는 구조 요청 클라이언트 게이트웨이 20대 서비스 공유 카운터 20대가 같은 값을 본다 왕복은 1ms 안에 여기서 자르면 서비스는 초과 요청을 아예 보지 않는다 서비스마다 따로 세면 한도가 서비스 수만큼 늘어난다 그래서 세는 자리는 한 군데여야 한다

세는 자리가 여러 곳이면 한도가 그만큼 늘어납니다. 서비스 3개가 각자 분당 1,000회 를 센다면 사용자는 실제로 분당 3,000회를 쓸 수 있습니다.

숫자가 정하는 것

숫자강제하는 것
피크 초당 5만판정이 요청마다 일어난다. 중앙 저장소 왕복이 곧 비용이다
게이트웨이 20대인스턴스별로 세면 실제 한도가 20배가 된다
한도 분당 1,000회창을 어떻게 자르느냐에 따라 경계에서 두 배가 지나간다
판정 1ms요청마다 기록을 남기는 방식은 예산을 넘긴다
오차 5퍼센트완벽한 합계를 포기해도 된다

무엇을 기준으로 세는가

한도의 기준은 셋 중 하나입니다. 이 선택이 나머지 설계보다 먼저입니다.

기준문제
API 키이 요구사항에 맞다. 발급 단위가 곧 책임 단위다
사용자로그인 전 요청을 셀 수 없다
접속 주소회사나 통신사 뒤의 수천 명이 한 덩어리로 묶인다

접속 주소 기준은 정상 사용자를 무더기로 자릅니다. 다만 키가 없는 요청에는 다른 방법이 없으므로, 인증 전 구간에만 넉넉한 한도로 함께 두는 경우가 많습니다.

정확도를 요구사항으로 적는다

"정확하게" 라고 쓰면 게이트웨이 20대가 매 요청마다 합계를 맞춰야 합니다. 그러면 판정이 저장소 속도에 묶입니다.

오차 5퍼센트 를 허용한다고 적어 두면 근사 계산과 지역 캐시를 쓸 수 있습니다. 분당 1,000회 한도에서 1,050회가 지나가는 것은 아무 문제가 아닙니다. 반대로 2,000회가 지나가는 것은 문제입니다. 허용 오차는 어떤 알고리즘이 탈락하는지를 정하는 기준이 됩니다.

면접에서 이렇게 나옵니다

Q.처리율 제한 장치의 요구사항을 어떻게 정리하시겠습니까

세는 기준과 허용 오차를 먼저 정합니다. 알고리즘은 그다음입니다.

구분내용
기능한도 판정, 초과 응답, 남은 횟수 알려주기, 키별 한도, 호출별 가중치
범위 밖과금, 봇 탐지, 대규모 공격 방어
비기능피크 초당 5만, 게이트웨이 20대, 한도 분당 1,000회, 판정 1ms, 오차 5퍼센트

그리고 각 숫자가 무엇을 강제하는지 말합니다. 게이트웨이 20대 는 카운터를 공유하게 만들고, 판정 1ms 는 요청마다 기록을 남기는 방식을 탈락시킵니다.

흔한 실수: 요구사항 단계에서 토큰 버킷과 슬라이딩 윈도우를 비교하기 시작하는 것. 무엇을 기준으로 세는지와 얼마나 정확해야 하는지가 없으면 어느 알고리즘이 맞는지 판단할 근거 자체가 없습니다. 면접에서는 이 순서가 곧 실력으로 읽힙니다.

Q.한도를 무엇을 기준으로 세시겠습니까

API 키 기준입니다. 발급 단위가 곧 책임 단위이기 때문입니다.

기준문제
API 키발급 단위가 책임 단위와 일치한다
사용자로그인 전 요청을 셀 수 없다
접속 주소회사나 통신사 뒤의 수천 명이 한 덩어리가 된다

접속 주소 기준은 정상 사용자를 무더기로 자릅니다. 한 회사에서 100명이 쓰면 그 100명이 한 사람 몫의 한도를 나눠 씁니다.

다만 키가 없는 요청에는 다른 방법이 없습니다. 인증 전 구간에만 넉넉한 한도로 주소 기준을 함께 두는 것이 현실적인 답입니다.

흔한 실수: 여러 기준을 동시에 걸면서 우선순위를 정하지 않는 것. 키 기준과 주소 기준을 함께 두면 어느 쪽에 걸려 거절됐는지 응답에서 알 수 없고, 사용자는 한도를 지켰는데 계속 막히는 상황을 겪습니다.

Q.허용 오차 5퍼센트 를 요구사항에 적는 이유가 무엇인가요

어떤 알고리즘이 탈락하는지를 정하는 기준이기 때문입니다.

"정확하게" 라고 쓰면 게이트웨이 20대 가 매 요청마다 합계를 맞춰야 하고, 판정이 저장소 왕복 속도에 묶입니다.

한도 1,000회에 1,050회가 지나가는 것은 문제가 아니다
2,000회가 지나가는 것은 문제다

오차를 적어 두면 근사 계산과 지역 캐시를 쓸 수 있습니다. 그리고 경계에서 두 배가 지나가는 방식은 오차 범위를 명백히 넘으므로 근거를 들어 탈락시킬 수 있습니다.

흔한 실수: 오차를 적지 않고 "최대한 정확하게" 로 두는 것. 그러면 모든 알고리즘이 후보로 남고, 고르는 근거가 취향이 됩니다. 정확도는 성능과 교환되는 값이라 요구사항에 숫자로 적어야 합니다.

Q.처리율 제한을 각 서비스에 두면 안 되나요

세는 자리가 여러 곳이면 한도가 그만큼 늘어납니다.

서비스 3개가 각자 분당 1,000회를 센다면 사용자는 실제로 3,000회를 쓸 수 있습니다. 한도는 사용자 하나에 대한 약속이므로 세는 지점도 하나여야 합니다.

두는 위치결과
서비스 앞 게이트웨이초과 요청이 서비스에 도달하지 않는다
각 서비스 안한도가 서비스 수만큼 늘어난다

게이트웨이에서 자르면 서비스는 초과 요청을 아예 보지 않으므로 보호 효과도 함께 얻습니다.

흔한 실수: 게이트웨이에 두면서 카운터를 인스턴스 메모리에 두는 것. 위치는 한 곳으로 모았는데 세는 값이 20개로 쪼개져 결과가 같아집니다. 위치를 모으는 것과 값을 공유하는 것은 별개의 결정입니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

처리율 제한 장치 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.