요청 속도 제한
요청 제한의 작동 방식, 여기서 429이 의미하는 것, 그리고 이를 유발하지 않는 클라이언트를 구현하는 방법.
한도는 공유되는 업스트림 처리 용량을 공정하게 사용할 수 있도록 합니다. 키별이 아닌 계정별로 적용되므로 키를 추가해도 상한이 높아지지 않습니다.
제한 항목
| 비교 항목 | 동작 |
|---|---|
| 동시 요청 | 계정별로 처리 중인 요청 수입니다. 429의 일반적인 원인입니다. |
| 분당 요청 수 | 지속적인 호출 빈도입니다. |
| 분당 토큰 수 | 입력과 출력을 합산한 처리량입니다. |
무제한 요금제에는 크레딧 잔액 대신 공정 사용 한도가 적용됩니다. 토큰당 요금은 없어지지만 동시 요청 상한은 유지됩니다.
429에 올바르게 대응하기
- 지터를 적용한 지수 백오프를 사용하세요. 1초, 2초, 4초, 8초 간격마다 무작위 비율만큼 시간을 더하거나 빼세요.
- 모든 요청을 한꺼번에 보내고 거부된 요청을 재시도하는 대신, 세마포어로 클라이언트 측 동시 요청 수를 제한하세요.
- 배치 작업은 최대한 병렬화하기보다 큐에 넣으세요. 처리량은 열린 소켓 수가 아니라 분당 토큰 수에 의해 제한됩니다.
- 취급하세요
529다음과는 다르게:429— 이는 사용자 측 문제가 아니라 업스트림 처리 용량 문제이며, 보통 몇 초 안에 해소됩니다.
import asyncio
sem = asyncio.Semaphore(8) class=class="s">"c"># ceiling on concurrency, tune to your plan
async def ask(client, body):
async with sem:
return await client.post(class="s">"/v1/messages", json=body)
Claude Code와 같은 에이전트 도구는 설계상 많은 작업을 적극적으로 병렬 실행합니다. 에이전트를 집중적으로 사용할 때 429 오류가 발생하면 요금제를 올리기 전에 도구의 병렬 처리 수준을 낮추세요.