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

어림의 정도를 고르기

얼마나 잘게 나눌지가 조절 손잡이다

앞 단계에서 두 가지를 봤습니다. 고정 윈도우는 값싸지만 경계에서 두 배를 통과시키고, 시각을 다 들고 있는 방식은 정확하지만 항목이 쌓입니다. 이 사이에 값싸면서 경계가 없는 방법이 있습니다.

이전 창을 겹치는 비율만큼 섞는다

이전 창의 값에 겹치는 비율을 곱해 현재 창의 값과 더하면 최근 60초를 어림할 수 있다 지금은 현재 창의 20초 지점 이전 창 900회 현재 창 300회 최근 60초가 덮는 구간 이전 창의 40초분 = 900 x 0.67 = 600 현재 창은 그대로 300. 합쳐서 900 으로 본다 정수 두 개로 끝난다. 항목을 쌓지 않는다 단, 이전 창 안에서 요청이 고르게 왔다고 가정한다

최근 60초는 이전 창의 뒷부분과 현재 창의 앞부분에 걸쳐 있습니다. 이전 창의 값에 겹치는 비율을 곱해 현재 창의 값과 더합니다.

어림한 값 = 이전 창 값 x 겹치는 비율 + 현재 창 값

정수 두 개만 쓰므로 항목이 쌓이지 않고, 계산도 곱셈 하나와 덧셈 하나입니다. 1ms 예산에 여유가 큽니다. 그리고 기준이 요청 시점이라 경계 버스트가 없습니다.

어림한다는 것은 가정을 두는 것이다

이 계산은 이전 창 안에서 요청이 고르게 왔다고 가정합니다. 실제로 고르면 매우 정확합니다. 몰려 있으면 어긋납니다.

이전 창의 실제 분포어림값
고르게 왔다거의 정확하다
창의 앞쪽에 몰렸다실제보다 크게 본다. 더 엄격해진다
창의 뒤쪽에 몰렸다실제보다 작게 본다. 더 느슨해진다

느슨해지는 쪽이 위험합니다. 이전 창의 요청이 모두 마지막 순간에 몰렸다면, 그 요청들은 지금도 최근 60초 안에 있는데 어림값은 비율만큼만 셉니다.

최악의 오차를 계산해 본다

현재 창의 절반 지점에서 겹치는 비율은 0.5입니다. 이전 창 1,000회가 모두 그 창의 끝에 몰렸다고 하면,

실제 최근 60초 = 1,000회
어림값 = 1,000 x 0.5 = 500회
남은 여유로 500회를 더 통과시킨다

최악에는 한도의 절반만큼 더 지나갈 수 있습니다. 오차 5퍼센트 는 이 최악을 덮지 못합니다.

잘게 나누면 가정이 약해진다

이 방식이 거친 이유는 창을 두 덩어리로만 보기 때문입니다. 덩어리를 잘게 나누면 가정이 닿는 범위가 줄어듭니다.

나눈 단위저장최악 오차
창 2개정수 2개한도의 절반
1초 버킷 60개정수 60개1초분
요청 시각 전부통과 요청 수만큼없다

같은 계열의 세 방식이고, 얼마나 잘게 나눌지가 정확도와 비용을 함께 정하는 손잡이입니다. 1초 버킷이면 어림하는 부분이 가장 오래된 1초뿐이라 오차가 실질적으로 사라집니다. 정수 60개는 키 10만 개에도 수십 메가바이트입니다.

그래서 실제 선택은 대개 버킷을 몇 개로 둘지입니다. 판정할 때 60개 값을 한 번의 왕복으로 받아올 수 있으면 1ms 예산에 들어옵니다. 값을 하나의 묶음 자료로 두고 필드를 나눠 쓰면 왕복이 늘지 않습니다.

그래서 요구사항을 다시 읽는다

여기서 판단이 갈립니다. 오차 5퍼센트 가 평균적으로 지켜야 하는 값인지, 최악에도 넘지 말아야 하는 값인지 요구사항이 말하지 않았습니다.

해석결론
평균 기준창 2개로도 충분하다. 실제 트래픽은 대개 고르다
최악 기준창 2개는 탈락한다. 잘게 나눠야 한다

면접에서 이 질문을 되돌려 묻는 것이 좋은 신호입니다. 숫자가 적혀 있어도 그 숫자가 평균인지 최악인지에 따라 답이 바뀝니다.

이 요구사항에서는 최악에도 오차 5퍼센트 를 지키기로 보고 1초 버킷 60개를 고릅니다. 창 2개보다 저장이 30배지만 절대량이 작고, 어림하는 부분이 가장 오래된 1초로 줄어듭니다.

창 하나만 저장소에 남기면 된다

현재 창의 값을 올리면서 이전 창의 값을 함께 읽습니다. 이름이 규칙적이라 두 이름을 한 번에 요청할 수 있고, 이전 창은 다음 창이 시작될 때까지만 필요하므로 만료가 두 창 길이면 충분합니다.

면접에서 이렇게 나옵니다

Q.두 창을 섞어 어림하는 방식을 설명해 주세요

이전 창의 값에 겹치는 비율을 곱해 현재 창의 값과 더합니다.

어림한 값 = 이전 창 값 x 겹치는 비율 + 현재 창 값

최근 60초는 이전 창의 뒷부분과 현재 창의 앞부분에 걸쳐 있습니다. 현재 창의 20초 지점이면 이전 창의 40초분이 겹치므로 비율은 0.67입니다.

비용
저장정수 두 개
계산곱셈 하나와 덧셈 하나
경계 버스트없다. 기준이 요청 시점이다

흔한 실수: 이 방식을 "정확한 슬라이딩 윈도우" 로 설명하는 것. 이름이 비슷하지만 어림값입니다. 어림한다는 사실과 그 가정을 함께 말하지 않으면, 뒤에서 오차를 묻는 질문에 답할 수 없습니다.

Q.이 방식의 오차는 어디서 오나요

이전 창 안에서 요청이 고르게 왔다는 가정에서 옵니다.

이전 창의 실제 분포어림값
고르게 왔다거의 정확하다
앞쪽에 몰렸다크게 본다. 더 엄격해진다
뒤쪽에 몰렸다작게 본다. 더 느슨해진다

느슨해지는 쪽이 위험합니다. 이전 창의 요청이 모두 그 창의 끝에 몰렸다면 그것들은 지금도 최근 60초 안에 있는데, 어림값은 겹치는 비율만큼만 셉니다.

흔한 실수: 오차가 작다고 단정하는 것. 실제 트래픽에서는 대개 작지만 최악에는 한도의 절반만큼 더 통과할 수 있습니다. 평균과 최악을 구분해 말해야 합니다.

Q.최악의 오차를 계산해 보시겠어요

한도의 절반만큼 더 통과할 수 있습니다.

현재 창의 절반 지점에서 겹치는 비율은 0.5입니다. 이전 창의 1,000회가 모두 그 창의 마지막 순간에 몰렸다고 하면,

실제 최근 60초 안의 요청 = 1,000회
어림값 = 1,000 x 0.5 = 500회
한도까지 500회를 더 통과시킨다

즉 최근 60초에 1,500회가 지나갑니다. 한도의 50퍼센트 초과입니다.

오차 5퍼센트 가 최악 기준이라면 이 방식은 탈락하고, 평균 기준이라면 통과합니다. 요구사항이 그 구분을 적지 않았다면 되돌려 물어야 합니다.

흔한 실수: 최악을 창 경계에서 찾는 것. 경계에서는 겹치는 비율이 1에 가까워 오히려 정확합니다. 최악은 창의 절반 지점입니다. 이런 계산은 직접 해 보지 않으면 직관이 반대로 갑니다.

Q.오차를 줄이려면 시각을 다 저장해야 하나요

아닙니다. 창을 잘게 나누면 됩니다. 나누는 정도가 정확도와 비용을 함께 정하는 손잡이입니다.

나눈 단위저장최악 오차
창 2개정수 2개한도의 절반
1초 버킷 60개정수 60개1초분
요청 시각 전부통과 요청 수만큼없다

세 방식은 같은 계열입니다. 1초 버킷이면 어림하는 부분이 가장 오래된 1초뿐이라 오차가 실질적으로 사라지고, 정수 60개는 키 10만 개에도 수십 메가바이트입니다.

판정할 때 60개 값을 한 묶음으로 한 번에 받아오면 왕복이 늘지 않아 1ms 예산에 들어옵니다.

흔한 실수: 정확도를 높이려고 곧바로 시각 저장으로 뛰는 것. 두 극단 사이에 조절 손잡이가 있는데 그것을 못 보는 답입니다. 얼마나 정확해야 하는지에 맞춰 손잡이를 돌리는 것이 설계입니다.

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

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

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