판정까지 만들었습니다. 이제 거절을 어떻게 알릴지입니다. 이 부분을 소홀히 하면 제한 장치가 부하를 오히려 키웁니다.
거절만 돌려주면 즉시 다시 온다
클라이언트는 실패하면 다시 시도하도록 만들어져 있습니다. 언제 다시 오라는 정보가 없으면 곧바로 다시 옵니다. 거절 응답이 값싸다 해도 요청 수는 줄지 않습니다.
그래서 응답에 두 가지를 담습니다.
| 담을 것 | 역할 |
|---|---|
| 상태 코드 429 | 한도 초과임을 기계가 판별할 수 있게 |
| 다시 시도할 시각까지의 초 | 언제 다시 올지 알려 준다 |
이것만으로는 부족합니다. 모든 클라이언트가 알려 준 시각에 정확히 다시 오면 그 순간에 또 몰립니다. 클라이언트 쪽에서 조금씩 흩뿌리는 처리가 짝으로 있어야 합니다. 한쪽만 있으면 몰림이 남습니다.
남은 횟수를 미리 알려 준다
거절되기 전에 알려 주면 잘 만든 클라이언트는 스스로 속도를 줄입니다.
| 알려 줄 값 | 뜻 |
|---|---|
| 한도 | 이 키의 한도 |
| 남은 횟수 | 지금 창에서 몇 번 더 쓸 수 있는지 |
| 초기화 시각 | 언제 다시 채워지는지 |
세 값을 모든 응답에 담습니다. 성공 응답에도 담는 것이 핵심입니다. 거절된 뒤에 알려 주면 이미 늦습니다.
어느 한도에 걸렸는지 말해 준다
키 한도와 조직 한도를 함께 걸었다면, 거절 응답에 어느 쪽인지 담습니다. 그러지 않으면 사용자는 자기 한도를 지켰는데 계속 막히는 이유를 알 수 없고, 문의가 우리에게 옵니다.
429 와 503 을 구분한다
둘 다 "지금은 안 된다" 이지만 원인이 다릅니다.
| 코드 | 뜻 | 클라이언트가 할 일 |
|---|---|---|
| 429 | 당신이 한도를 넘었다 | 자기 속도를 줄인다 |
| 503 | 서버가 버겁다 | 잠시 뒤 같은 요청을 다시 보낸다 |
이것을 섞어 쓰면 클라이언트가 잘못된 대응을 합니다. 429 를 받고 "서버 문제겠지" 하며 그대로 재시도하면 계속 막힙니다.
거절도 기록은 남긴다
어느 키가 얼마나 거절되는지 모르면 한도가 적절한지 판단할 수 없습니다. 다만 판정 경로에 무거운 기록을 붙이면 남용이 심할 때 가장 많이 실행되는 경로가 가장 비싸집니다. 개수만 세거나 표본만 남깁니다.
문서에 적는 것까지가 이 기능이다
한도, 창의 길이, 초과 시 응답, 재시도 권장 방식을 문서에 적습니다. 이것이 없으면 클라이언트를 만드는 사람이 우리 한도를 알 방법이 시행착오뿐입니다. 처리율 제한은 서버 기능이 아니라 서버와 클라이언트의 약속입니다.