지수 백오프를 적용한 재시도
tenacity를 사용해 일시적인 실패를 지수적으로 늘어나는 지연 시간과 지터를 적용해 재시도해보세요.
지수 백오프를 적용한 재시도은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
재시도하는 이유
외부 호출(LLM, 검색 API, 벡터 데이터베이스)은 일시적으로 실패할 수 있습니다. 간단한 재시도만으로도 대부분의 간헐적 오류를 복구하여 사용자에게 불편을 주지 않을 수 있습니다.
해서는 안 되는 일
좁은 반복문에서 즉시 재시도하지 마십시오. 서비스에 과도한 요청을 보내게 되고, 속도 제한기에 의해 접근이 차단됩니다:
# BAD
for _ in range(10):
try:
return call_api()
except Exception:
pass지수 백오프
실패할 때마다 더 오래 기다리십시오. 2를 밑으로 하는 지수 방식이 일반적입니다:
import time
def call_with_backoff(fn, attempts=5):
for i in range(attempts):
try:
return fn()
except TransientError:
if i == attempts - 1:
raise
time.sleep(2 ** i) # 1, 2, 4, 8, 16 seconds지터 추가
지터가 없으면 여러 클라이언트의 재시도 시점이 겹쳐 트래픽이 한꺼번에 몰립니다. 무작위 오프셋을 추가하십시오:
import random
sleep = (2 ** i) + random.uniform(0, 1)
time.sleep(sleep)Tenacity 사용
tenacity 라이브러리가 이 작업을 대신 구현합니다:
from tenacity import retry, wait_exponential_jitter, stop_after_attempt, retry_if_exception_type
import requests
@retry(
wait=wait_exponential_jitter(initial=1, max=30),
stop=stop_after_attempt(5),
retry=retry_if_exception_type((requests.Timeout, requests.ConnectionError))
)
def search(query):
return requests.get('https://api.tavily.com/search', timeout=10).json()일시적 오류만 재시도
다음 상황에서는 절대 재시도하지 마십시오:
- 4xx 오류(잘못된 요청이므로 재시도해도 도움이 되지 않습니다)
- 인증 실패
- 검증 오류
다음 상황에서는 재시도하십시오:
- 시간 초과
- 5xx 서버 오류
- 속도 제한(더 오래 기다린 후)
속도 제한을 고려한 재시도
Retry-After 헤더를 준수하십시오:
if response.status_code == 429:
wait = int(response.headers.get('Retry-After', 5))
time.sleep(wait)
continue전체 재시도 시간 제한
재시도에 걸릴 수 있는 전체 시간을 제한하십시오. 일반적으로 사용자에게 직접 응답하는 호출에는 30~60초를 사용합니다:
from tenacity import stop_after_delay
@retry(
wait=wait_exponential_jitter(initial=1, max=10),
stop=stop_after_delay(60)
)
def call_api():
...멱등성 헤더
멱등적이지 않은 API(Stripe 등)에는 모든 재시도에 멱등성 키를 포함하여 중복 작업이 하나로 합쳐지도록 하십시오:
headers = {'Idempotency-Key': f'agent-call-{run_id}-{tool_id}'}LLM 호출도 재시도
OpenAI 및 Anthropic SDK는 1~2회 자동으로 재시도합니다. 다음과 같이 설정할 수 있습니다:
client = OpenAI(max_retries=5, timeout=30.0)비동기 재시도
비동기 코드에서는 다음과 같이 하십시오:
from tenacity import AsyncRetrying
async for attempt in AsyncRetrying(wait=wait_exponential_jitter(), stop=stop_after_attempt(5)):
with attempt:
result = await call_api()재시도 로깅
모든 재시도에는 시도 횟수, 대기 시간, 오류 원인을 기록해야 합니다. 그렇지 않으면 "왜 이렇게 느리지?"라는 문제를 디버깅할 수 없습니다.
재시도와 시간 제한
각 시도에는 짧은 시간 제한(예: 10초)을 설정하고, stop_after_delay를 사용해 전체 제한(예: 60초)을 설정하십시오. 둘 다 없으면 멈춘 연결이 영원히 대기할 수 있습니다.
지터가 필요한 이유
재시도 지연 시간에 무작위 지터를 추가하는 이유는 무엇입니까?
요약
지수 백오프 + 지터 + 제한된 전체 시간 + 일시적 오류에 대한 재시도만 사용하십시오. 상용구 코드를 생략하려면 tenacity를 사용하십시오.
자주 묻는 질문
“지수 백오프를 적용한 재시도” 강의는 무료인가요?
네 — “지수 백오프를 적용한 재시도” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
“지수 백오프를 적용한 재시도”에서 뭘 배우나요?
tenacity를 사용해 일시적인 실패를 지수적으로 늘어나는 지연 시간과 지터를 적용해 재시도해보세요. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Agents을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“지수 백오프를 적용한 재시도” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 멱등 도구 및 부작용
- 지수 백오프를 적용한 재시도
- 시간 제한 및 회로 차단기
- 도구 출력 검증(Pydantic)