시스템 설계, 기술 면접 대비

처리율 제한 장치 설계 면접 퀴즈

무엇을 기준으로 세는지가 알고리즘보다 먼저다

공개 API 게이트웨이 하나를 요구사항부터 끝까지 설계합니다. 피크 초당 5만, 게이트웨이 20대, 한도 분당 1,000회, 판정 1ms, 허용 오차 5퍼센트라는 제약 아래에서 세는 기준, 고정 윈도우의 경계 버스트, 어림의 정도, 토큰 버킷, 분산 카운터, 초과 응답, 한도 운영을 다룹니다.

로그인 없이 풀어보기
16개 문제, 무료

이 설계에 주어진 요구사항

문제는 모두 이 하나의 요구사항 안에서 풉니다.

처리율 제한 장치 설계

공개 API 게이트웨이

외부에 공개한 API 앞에서 요청량을 제한하는 장치를 만듭니다.

이번에 만드는 기능

  • 한도를 넘은 요청 거절하기
  • API 키마다 다른 한도 적용하기
  • 무거운 호출을 더 크게 세기
  • 남은 횟수와 초기화 시각 알려주기
  • 거절 응답으로 다시 시도할 시점 알려주기

범위 밖

  • 과금과 사용량 정산
  • 봇 탐지
  • 대규모 공격 방어
  • 인증 자체

지켜야 하는 수치

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

전제로 주어진 것

  • 한도는 API 키를 단위로 한다
  • 키마다 한도를 지켜도 서비스 전체가 용량을 넘으면 안 된다
  • 판정 저장소에 장애가 나도 서비스는 요청을 받아야 한다

학습할 핵심 개념

요구사항 정리와 세는 기준 정하기
고정 윈도우와 경계 버스트
요청 시각을 다 들고 세기
어림의 정도를 고르기
토큰 버킷과 버스트 정책
게이트웨이 20대가 값을 공유하기
초과 응답과 클라이언트 협조
한도를 정하고 굴리기

핵심 개념 미리보기

처리율 제한 장치 설계 면접에서 꼭 나오는 개념을 미리 확인하세요

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

핵심

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

항목
대상공개 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.처리율 제한 장치의 요구사항을 어떻게 정리하시겠습니까
  • Q.한도를 무엇을 기준으로 세시겠습니까
  • Q.허용 오차 5퍼센트 를 요구사항에 적는 이유가 무엇인가요

고정 윈도우와 경계 버스트

핵심

앞 단계에서 API 키 기준으로 세고, 게이트웨이에서 자르고, 오차 5퍼센트 까지 허용한다고 정했습니다. 이제 어떻게 셀지를 고릅니다. 가장 값싼 방법부터 봅니다.

시각으로 창을 자른다

키와 분을 붙여 만든 이름 하나에 숫자를 올립니다.

키 abc 의 10시 01분 창: 값을 1 올리고 1,000 을 넘었는지 본다
창이 바뀌면 이름이 바뀌므로 값도 새로 시작한다

키마다 정수 하나만 쓰므로 메모리가 거의 들지 않고, 판정도 값 하나 올리는 것으로 끝납니다. 1ms 예산에 여유가 큽니다.

그런데 경계에서 두 배가 지나간다

고정 윈도우에서 경계 양쪽에 요청이 몰리면 2초 동안 한도의 두 배가 지나간다 창을 분 단위로 자른다. 창마다 1,000회 10시 00분 창 10시 01분 창 이 2초 동안 2,000회 59초에 1,000회, 61초에 다시 1,000회가 통과한다 두 창은 각자 한도를 지켰다. 규칙은 어긋나지 않았다 허용 오차 5퍼센트로는 덮을 수 없는 100퍼센트 초과다 그래도 키마다 정수 하나만 쓴다. 가장 값싼 방법이다

두 창은 각자 한도를 지켰습니다. 규칙은 어긋나지 않았는데 결과가 어긋납니다. 서버가 실제로 받은 부하는 2초에 2,000회이고, 이것은 한도가 막으려던 것입니다.

관점판정
창 단위로 보면각각 1,000회. 정상
실제 부하로 보면2초에 2,000회. 한도의 두 배

허용 오차 5퍼센트 는 1,050회를 허용하려고 적은 값입니다. 2,000회는 그 범위 밖이므로 이 방법은 탈락합니다. 요구사항에 오차를 숫자로 적어 둔 덕분에 취향이 아니라 근거로 자를 수 있습니다.

그래도 이 방법이 맞는 경우가 있다

경계 버스트가 문제가 되는 것은 한도가 곧 용량 한계에 가까울 때입니다. 한도를 넉넉하게 잡아 두었고 두 배가 와도 서버가 견딘다면, 정수 하나로 끝나는 이 방법이 가장 좋은 선택입니다.

상황고정 윈도우가
한도가 용량 한계에 가깝다위험하다. 두 배가 그대로 들어온다
한도가 남용 방지용이고 여유가 크다충분하다. 더 정교한 방법은 과설계다

"정확한 방법이 늘 낫다" 가 아닙니다. 무엇을 막으려는 한도인지에 따라 답이 갈립니다.

창 이름을 언제 지우나

창이 지나면 그 이름의 값은 다시 쓰이지 않습니다. 남겨 두면 키 수만큼 쓰레기가 쌓이므로 만료를 창 길이보다 조금 길게 걸어 둡니다. 지우는 코드를 따로 만들지 않고 저장소가 치우게 합니다.

시계가 어긋나면 창도 어긋난다

창 이름을 각 게이트웨이가 자기 시계로 만들면, 시계가 몇 초 다른 두 대가 서로 다른 창에 값을 올립니다. 그러면 같은 시점의 요청이 두 창에 나뉘어 한도가 느슨해집니다. 창 이름은 저장소 쪽 시각으로 만들거나, 게이트웨이 시계를 맞춰 두는 것이 전제입니다.

면접에서 이렇게 나옵니다
  • Q.고정 윈도우 방식은 어떻게 동작하나요
  • Q.고정 윈도우의 경계 버스트가 무엇인가요
  • Q.허용 오차가 5퍼센트 인데 고정 윈도우를 쓸 수 있나요

요청 시각을 다 들고 세기

핵심

앞 단계에서 고정 윈도우가 경계에서 두 배를 통과시키는 것을 봤습니다. 원인은 자르는 기준이 고정된 시각이라는 것이었습니다. 기준을 요청 시점으로 바꾸면 경계가 사라집니다.

통과한 요청의 시각을 모아 둔다

요청 시각을 모두 저장하고 최근 60초 밖의 것을 버리면 경계가 없는 정확한 판정이 된다 요청 시각을 모두 저장한다 최근 60초. 이 안의 개수를 센다 창을 벗어났다. 버린다 기준이 요청 시점이라 경계가 없다. 언제 봐도 뒤로 60초다 대신 통과한 요청마다 항목 하나가 남는다 키 10만 개에 한도 1,000이면 최대 1억 항목

판정은 두 단계입니다. 60초보다 오래된 항목을 버리고, 남은 개수를 한도와 비교합니다. 언제 보든 뒤로 60초를 보므로 경계 버스트가 원리적으로 없습니다.

비용은 들고 있는 양이다

한 키가 들고 있는 항목은 최대 한도만큼입니다. 한도가 분당 1,000회 이면 키마다 최대 1,000개입니다.

활성 키최대 항목 수
1,000개100만
10만 개1억

항목 하나가 수십 바이트라도 1억 개면 수 기가바이트입니다. 그리고 이 메모리는 한도를 다 쓰는 키가 많을수록 늘어납니다.

거절한 요청은 저장하지 않는다

한도를 넘어 거절한 요청까지 저장하면 이상한 일이 생깁니다. 한도를 넘긴 뒤에도 계속 요청을 보내는 쪽이 저장소를 계속 키웁니다. 막으려던 상대가 비용을 늘리는 구조가 됩니다.

통과시킨 요청만 기록한다
거절은 세지 않고 응답만 돌려준다

이 규칙은 남용을 막는 장치에서 일반적으로 성립합니다. 거절 자체가 비싸면 거절이 공격 수단이 됩니다.

판정 비용도 요청마다 든다

버리기와 세기가 매 요청에 붙습니다. 피크 초당 5만 요청이면 그만큼 반복됩니다. 저장소가 정렬된 집합을 다뤄 준다면 한 번에 처리할 수 있지만, 버릴 항목이 많이 쌓인 키에서는 그 한 번이 길어집니다.

1ms 예산에서 이 방식은 여유가 없습니다. 그래서 선택은 둘 중 하나입니다.

선택언제
이 방식을 쓴다키 수가 적고 정확도가 돈과 직결될 때. 유료 호출 과금 경계 등
더 값싼 근사로 간다키가 많고 오차가 허용될 때. 이 요구사항이 그렇다

정확한 방법이 늘 정답은 아니다

이 방식은 오차가 0입니다. 그런데 요구사항은 오차 5퍼센트 를 허용한다고 적었습니다. 허용된 오차를 쓰지 않으면 그만큼을 비용으로 내는 것입니다.

요구사항에 적힌 여유는 쓰라고 있는 것입니다. 정확도를 공짜로 얻을 수 있을 때만 정확한 쪽을 고릅니다.

면접에서 이렇게 나옵니다
  • Q.요청 시각을 저장하는 방식은 어떻게 판정하나요
  • Q.이 방식의 메모리 비용은 얼마나 되나요
  • Q.오차 5퍼센트 가 허용되는데 정확한 방식을 쓰면 안 되나요

더 많은 개념과 문제는 가입 후 이용할 수 있어요

먼저 5문제 맛보기

처리율 제한 장치 설계 면접 빈출 질문

실제 면접에서 자주 나오는 질문들입니다

Q.

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

요구사항 정리와 세는 기준 정하기 개념 정리 보기
Q.

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

요구사항 정리와 세는 기준 정하기 개념 정리 보기
Q.

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

요구사항 정리와 세는 기준 정하기 개념 정리 보기
Q.

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

요구사항 정리와 세는 기준 정하기 개념 정리 보기
Q.

고정 윈도우 방식은 어떻게 동작하나요

고정 윈도우와 경계 버스트 개념 정리 보기
Q.

고정 윈도우의 경계 버스트가 무엇인가요

고정 윈도우와 경계 버스트 개념 정리 보기
Q.

허용 오차가 5퍼센트 인데 고정 윈도우를 쓸 수 있나요

고정 윈도우와 경계 버스트 개념 정리 보기
Q.

지난 창의 데이터를 어떻게 정리하나요

고정 윈도우와 경계 버스트 개념 정리 보기

이런 점이 좋아요

허용 오차로 알고리즘을 자르는 근거 만들기

정확도와 비용의 조절 손잡이를 다루는 감각

한도를 계측으로 정하는 순서

지금 바로 시작하세요

무료로 처리율 제한 장치 설계 퀴즈를 풀고, AI 오답 분석으로 실력을 키우세요.