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

한도를 정하고 굴리기

계측 없이 정한 한도는 정상 사용자를 자른다

알고리즘과 응답까지 정했습니다. 마지막으로 분당 1,000회 이라는 숫자를 어디서 얻는지입니다. 이 부분이 실무와 면접에서 가장 자주 빠집니다.

재기 전에 정하지 않는다

한도를 먼저 재기만 하고 나중에 자르는 단계적 적용 한도를 정하는 순서 1. 재기만 한다 자르지 않는다 2. 분포를 본다 상위 1퍼센트는 누구 3. 자르기 시작 알린 뒤에 계측 없이 정한 한도는 정상 사용자를 자른다 재기만 하는 기간에 이미 넘는 키를 찾아 먼저 알린다 한도를 두 겹으로 둔다. 키마다, 그리고 전체 용량 보호용으로 가장 위험한 배포는 한도를 처음 켜는 배포다

한도를 감으로 정하면 두 가지 중 하나가 됩니다. 너무 높아 아무것도 막지 못하거나, 너무 낮아 정상 사용자를 자릅니다. 그래서 순서가 있습니다.

단계하는 일
1판정 논리를 켜되 자르지 않는다. 넘었을 값만 기록한다
2키별 사용량 분포를 본다. 상위 1퍼센트가 누구인지 확인한다
3한도를 정하고, 넘는 키에 먼저 알린 뒤 자르기 시작한다

가장 위험한 배포는 한도를 처음 켜는 배포입니다. 그때까지 아무 제약 없이 쓰던 사용자가 갑자기 막히고, 그것이 우리 잘못으로 보이지 않기 때문에 원인 파악도 늦습니다.

한도를 두 겹으로 둔다

키마다의 한도는 공평함을 위한 것입니다. 그런데 키가 아주 많아지면 각자 한도를 지켜도 전체가 넘칠 수 있습니다.

기준목적
키마다API 키한 사용자가 남을 방해하지 않게
전체서비스 또는 게이트웨이우리 용량을 넘지 않게

두 번째 겹이 발동하면 정상 사용자도 거절됩니다. 그래서 이때는 응답을 다르게 줍니다. 사용자 잘못이 아니므로 서버가 버겁다는 쪽으로 알립니다.

한도는 하나의 숫자가 아니다

같은 API 라도 비용이 다릅니다. 목록 조회와 대량 내보내기가 같은 한 번일 수 없습니다.

비싼 호출은 여러 번으로 센다
읽기와 쓰기에 다른 한도를 둔다
등급마다 다른 한도를 둔다

비용이 다른 것을 같게 세면 사용자가 비싼 쪽으로 몰립니다. 한 번의 값이 같으니 당연한 반응입니다.

바꿀 때가 만들 때보다 어렵다

한도를 낮추는 변경은 정상 사용자의 코드를 깨뜨립니다. 그래서 낮출 때는 만들 때와 같은 순서를 다시 밟습니다. 먼저 재고, 넘는 키를 찾아 개별로 알리고, 기간을 준 뒤 적용합니다.

올리는 것은 쉬워 보이지만 되돌리기 어렵습니다. 사용자가 그 여유에 맞춰 코드를 만들면 다시 낮추는 것이 앞의 어려운 변경이 됩니다.

무엇을 보고 한도가 맞는지 판단하나

지표의미
거절 비율갑자기 오르면 한도가 낮거나 남용이 시작됐다
거절된 키 수소수면 남용, 다수면 한도가 낮다
한도 근처에서 머무는 키곧 막힐 사용자. 미리 알릴 대상

거절 비율만 보면 두 상황을 구분할 수 없습니다. 한 키가 많이 막히는 것과 많은 키가 조금씩 막히는 것은 전혀 다른 문제이고, 대응도 반대입니다.

면접에서 이렇게 나옵니다

Q.한도를 분당 1,000회 으로 정한 근거를 어떻게 만드시겠습니까

먼저 재기만 하는 기간을 두고, 사용량 분포를 본 뒤에 정합니다.

단계하는 일
1판정을 켜되 자르지 않고 넘었을 값만 기록한다
2키별 사용량 분포를 본다. 상위 1퍼센트가 누구인지 본다
3한도를 정하고 넘는 키에 먼저 알린 뒤 자른다

감으로 정하면 너무 높아 아무것도 막지 못하거나, 너무 낮아 정상 사용자를 자릅니다.

흔한 실수: 한도를 정하는 것을 설계가 아니라 설정으로 보는 것. 어떤 알고리즘을 쓰는지보다 그 숫자가 맞는지가 사용자에게 미치는 영향이 큽니다. 가장 위험한 배포는 한도를 처음 켜는 배포입니다.

Q.키마다 한도를 지켜도 전체가 넘칠 수 있지 않나요

맞습니다. 그래서 한도를 두 겹으로 둡니다.

기준목적
키마다API 키한 사용자가 남을 방해하지 않게
전체서비스나 게이트웨이우리 용량을 넘지 않게

키가 아주 많아지면 각자 한도를 지켜도 합계가 용량을 넘습니다. 두 번째 겹은 그때를 위한 것입니다.

두 번째 겹이 발동하면 정상 사용자도 거절되므로 응답을 다르게 줍니다. 사용자 잘못이 아니니 서버가 버겁다는 쪽으로 알립니다.

흔한 실수: 전체 한도에도 429 를 주는 것. 클라이언트는 자기 속도를 줄여야 한다고 이해하지만 실제로는 줄일 필요가 없습니다. 원인이 누구에게 있는지가 응답 코드로 전달됩니다.

Q.모든 API 에 같은 한도를 적용해도 되나요

아닙니다. 호출마다 비용이 다르므로 세는 값도 달라야 합니다.

목록 조회와 대량 내보내기가 같은 한 번일 수 없습니다.

비싼 호출은 여러 번으로 센다
읽기와 쓰기에 다른 한도를 둔다
등급마다 다른 한도를 둔다

비용이 다른 것을 같게 세면 사용자가 비싼 쪽으로 몰립니다. 한 번의 값이 같으니 합리적인 반응이고, 그 결과 서버가 먼저 무너집니다.

흔한 실수: 비싼 호출에 별도의 한도를 새로 만드는 것. 한도가 여러 개면 어디에 걸렸는지 설명하기 어렵고 문서도 복잡해집니다. 같은 한도 안에서 가중치를 다르게 세는 편이 사용자에게 단순합니다.

Q.한도가 적절한지 무엇을 보고 판단하시겠습니까

거절 비율과 거절된 키 수를 함께 봅니다. 하나만 보면 반대 상황을 구분할 수 없습니다.

지표의미
거절 비율갑자기 오르면 한도가 낮거나 남용이 시작됐다
거절된 키 수소수면 남용, 다수면 한도가 낮다
한도 근처의 키곧 막힐 사용자. 미리 알릴 대상

한 키가 많이 막히는 것과 많은 키가 조금씩 막히는 것은 전혀 다른 문제이고 대응이 반대입니다. 앞은 그 키를 확인할 일이고, 뒤는 한도를 다시 볼 일입니다.

흔한 실수: 거절 비율만 대시보드에 두는 것. 그 숫자는 두 상황에서 똑같이 오릅니다. 키 수를 함께 보지 않으면 남용 대응과 한도 조정을 거꾸로 하게 됩니다.

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

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

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