0Pricing
AI Agents · 강의

지수 백오프를 적용한 재시도

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 멱등 도구 및 부작용
  2. 지수 백오프를 적용한 재시도
  3. 시간 제한 및 회로 차단기
  4. 도구 출력 검증(Pydantic)
← AI Agents(으)로 돌아가기