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

초과 응답과 클라이언트 협조

거절만 돌려주면 곧바로 다시 온다

판정까지 만들었습니다. 이제 거절을 어떻게 알릴지입니다. 이 부분을 소홀히 하면 제한 장치가 부하를 오히려 키웁니다.

거절만 돌려주면 즉시 다시 온다

거절만 돌려주면 재시도가 몰리고 다시 올 시각을 알려주면 흩어진다 429 만 돌려주면 거절당한 즉시 다시 온다. 부하가 더 커진다 언제 다시 올지 알려주면 Retry-After 와 클라이언트의 흩뿌리기가 짝이다 한쪽만 있으면 같은 시각에 다시 몰린다

클라이언트는 실패하면 다시 시도하도록 만들어져 있습니다. 언제 다시 오라는 정보가 없으면 곧바로 다시 옵니다. 거절 응답이 값싸다 해도 요청 수는 줄지 않습니다.

그래서 응답에 두 가지를 담습니다.

담을 것역할
상태 코드 429한도 초과임을 기계가 판별할 수 있게
다시 시도할 시각까지의 초언제 다시 올지 알려 준다

이것만으로는 부족합니다. 모든 클라이언트가 알려 준 시각에 정확히 다시 오면 그 순간에 또 몰립니다. 클라이언트 쪽에서 조금씩 흩뿌리는 처리가 짝으로 있어야 합니다. 한쪽만 있으면 몰림이 남습니다.

남은 횟수를 미리 알려 준다

거절되기 전에 알려 주면 잘 만든 클라이언트는 스스로 속도를 줄입니다.

알려 줄 값
한도이 키의 한도
남은 횟수지금 창에서 몇 번 더 쓸 수 있는지
초기화 시각언제 다시 채워지는지

세 값을 모든 응답에 담습니다. 성공 응답에도 담는 것이 핵심입니다. 거절된 뒤에 알려 주면 이미 늦습니다.

어느 한도에 걸렸는지 말해 준다

키 한도와 조직 한도를 함께 걸었다면, 거절 응답에 어느 쪽인지 담습니다. 그러지 않으면 사용자는 자기 한도를 지켰는데 계속 막히는 이유를 알 수 없고, 문의가 우리에게 옵니다.

429 와 503 을 구분한다

둘 다 "지금은 안 된다" 이지만 원인이 다릅니다.

코드클라이언트가 할 일
429당신이 한도를 넘었다자기 속도를 줄인다
503서버가 버겁다잠시 뒤 같은 요청을 다시 보낸다

이것을 섞어 쓰면 클라이언트가 잘못된 대응을 합니다. 429 를 받고 "서버 문제겠지" 하며 그대로 재시도하면 계속 막힙니다.

거절도 기록은 남긴다

어느 키가 얼마나 거절되는지 모르면 한도가 적절한지 판단할 수 없습니다. 다만 판정 경로에 무거운 기록을 붙이면 남용이 심할 때 가장 많이 실행되는 경로가 가장 비싸집니다. 개수만 세거나 표본만 남깁니다.

문서에 적는 것까지가 이 기능이다

한도, 창의 길이, 초과 시 응답, 재시도 권장 방식을 문서에 적습니다. 이것이 없으면 클라이언트를 만드는 사람이 우리 한도를 알 방법이 시행착오뿐입니다. 처리율 제한은 서버 기능이 아니라 서버와 클라이언트의 약속입니다.

면접에서 이렇게 나옵니다

Q.한도를 초과한 요청에 어떻게 응답하시겠습니까

429 와 함께 다시 시도할 시각까지의 초를 담습니다.

거절만 돌려주면 클라이언트는 곧바로 다시 옵니다. 실패하면 재시도하도록 만들어져 있기 때문입니다. 요청 수가 줄지 않으므로 제한 장치가 부하를 키웁니다.

담을 것역할
429한도 초과임을 기계가 판별할 수 있게
다시 시도할 초언제 다시 올지 알려 준다

그리고 클라이언트 쪽에서 그 시각을 조금씩 흩뿌려야 합니다. 한쪽만 있으면 알려 준 시각에 다시 몰립니다.

흔한 실수: 429 와 503 을 섞어 쓰는 것. 429 는 "당신이 한도를 넘었다" 이고 503 은 "서버가 버겁다" 입니다. 뜻이 다르면 클라이언트가 할 일도 다릅니다. 429 를 서버 문제로 받아들인 클라이언트는 속도를 줄이지 않고 계속 막힙니다.

Q.남은 횟수를 어떻게 알려 주시겠습니까

모든 응답에 한도, 남은 횟수, 초기화 시각을 담습니다. 성공 응답에도 담습니다.

한도이 키의 한도
남은 횟수지금 창에서 몇 번 더 쓸 수 있는지
초기화 시각언제 다시 채워지는지

거절된 뒤에 알려 주면 이미 늦습니다. 미리 보이면 잘 만든 클라이언트가 스스로 속도를 줄이고, 그러면 거절 자체가 줄어듭니다.

흔한 실수: 남은 횟수를 알려 주려고 판정 외에 조회를 한 번 더 하는 것. 판정할 때 이미 값을 알고 있으므로 그 값을 그대로 응답에 담으면 추가 왕복이 없습니다. 어림 방식이면 어림값 기준으로 알려 주고, 그 사실을 문서에 적습니다.

Q.거절된 요청을 어떻게 관찰하시겠습니까

개수만 세거나 표본만 남깁니다. 판정 경로에 무거운 기록을 붙이지 않습니다.

어느 키가 얼마나 거절되는지 모르면 한도가 적절한지 판단할 수 없습니다. 그런데 남용이 심할 때 가장 많이 실행되는 경로가 거절 경로입니다.

키별 거절 개수는 정수 하나로 센다
자세한 기록은 표본만 남긴다

막는 일이 비싸지면 막는 것 자체가 공격 수단이 됩니다. 이 원칙은 요청 시각을 저장하는 방식에서도 같았습니다.

흔한 실수: 거절할 때마다 경고 알림을 보내는 것. 남용 한 번에 알림 수천 개가 오고, 정작 중요한 알림이 그 안에 묻힙니다. 알림은 거절 비율이 평소와 크게 달라질 때 한 번 보냅니다.

Q.처리율 제한을 문서에 어떻게 적으시겠습니까

한도, 창의 길이, 초과 시 응답, 권장 재시도 방식을 적습니다.

이것이 없으면 클라이언트를 만드는 사람이 우리 한도를 알 방법이 시행착오뿐입니다. 막히면서 배우게 되고, 그 과정이 우리 부하로 돌아옵니다.

한도가 무엇을 기준으로 세는지(키인지 사용자인지)
창이 얼마이고 언제 초기화되는지
초과 시 어떤 응답이 오는지
어떻게 다시 시도하기를 권하는지

처리율 제한은 서버 기능이 아니라 서버와 클라이언트의 약속입니다. 약속을 적어 두지 않으면 절반만 만든 것입니다.

흔한 실수: 한도를 조용히 바꾸는 것. 한도를 낮추는 변경은 정상 사용자의 코드를 깨뜨립니다. 미리 알리고, 가능하면 먼저 재기만 하는 기간을 두고 넘는 키에 개별로 알립니다.

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

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

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