Foundry
처리율 제한 장치 설계
중급
핵심

고정 윈도우와 경계 버스트

규칙을 지켰는데 두 배가 지나간다

앞 단계에서 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.고정 윈도우 방식은 어떻게 동작하나요

키와 시간 구간을 붙여 만든 이름 하나에 숫자를 올리고 한도와 비교합니다.

키 abc 의 10시 01분 창: 값을 1 올린다
그 값이 1,000 을 넘으면 거절한다
창이 바뀌면 이름이 바뀌므로 값도 새로 시작한다

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

지난 창의 값은 다시 쓰이지 않으므로 만료를 창 길이보다 조금 길게 걸어 저장소가 치우게 합니다.

흔한 실수: 창 이름을 각 게이트웨이의 시계로 만드는 것. 시계가 몇 초 다른 두 대가 서로 다른 창에 값을 올려 같은 시점의 요청이 나뉘고, 한도가 그만큼 느슨해집니다. 이름의 기준 시각은 한 곳에서 와야 합니다.

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

창 경계 양쪽에 한도만큼씩 몰리면 짧은 구간에 두 배가 지나가는 것입니다.

10시 00분 59초에 1,000회 통과
10시 01분 01초에 다시 1,000회 통과
2초 동안 2,000회가 서버에 도달했다
관점판정
창 단위로 보면각각 1,000회. 정상
실제 부하로 보면2초에 2,000회

두 창 모두 규칙을 지켰습니다. 규칙은 어긋나지 않았는데 결과가 어긋나는 것이 이 방식의 성질입니다.

흔한 실수: 창을 더 짧게 잘라 해결하려는 것. 창이 10초면 경계 버스트도 10초 구간의 두 배로 줄어들지만 두 배라는 성질 자체는 남습니다. 그리고 창이 짧아지면 정상 사용자가 순간적인 요청 묶음에 자주 걸립니다.

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

이 요구사항에서는 탈락합니다. 경계 버스트는 100퍼센트 초과이고 오차 범위 밖입니다.

오차 5퍼센트 는 1,000회 한도에서 1,050회까지를 허용하려고 적은 값입니다. 2,000회는 그 범위와 성질이 다릅니다.

이것이 요구사항에 오차를 숫자로 적어 두는 이유입니다. 취향이 아니라 근거로 알고리즘을 자를 수 있습니다.

방식최대 초과
고정 윈도우한도의 100퍼센트
허용치한도의 5퍼센트

흔한 실수: 고정 윈도우를 무조건 나쁜 방법으로 외우는 것. 한도가 남용 방지용이고 용량에 여유가 크다면 두 배가 와도 문제가 없고, 그때는 정수 하나로 끝나는 이 방식이 가장 좋은 선택입니다. 무엇을 막으려는 한도인지가 답을 정합니다.

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

만료를 창 길이보다 조금 길게 걸어 저장소가 치우게 합니다. 지우는 코드를 따로 만들지 않습니다.

창이 지나면 그 이름의 값은 다시 읽히지 않습니다. 그런데 남겨 두면 키 수와 지난 창 수를 곱한 만큼 쌓입니다.

창 길이 1분이면 만료는 2분 정도
값을 처음 올릴 때 만료를 함께 건다

만료를 창 길이와 똑같이 두면 경계에서 아직 판정에 쓰이는 값이 사라질 수 있어 조금 여유를 둡니다.

흔한 실수: 값을 올릴 때마다 만료를 다시 거는 것. 요청이 계속 오는 키의 창이 계속 연장되어 지난 창의 값이 살아남습니다. 만료는 처음 만들 때만 걸거나, 창의 끝 시각을 기준으로 절대 시각으로 걸어야 합니다.

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

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

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