재시도 전략

Google 생성형 AI SDK 클라이언트 라이브러리에는 시간 초과, 네트워크 문제, 비율 제한 (HTTP 4295xx 상태 코드)과 같은 일시적인 오류를 처리하기 위한 지수 백오프를 사용하는 자동 재시도 로직이 포함되어 있습니다. 예를 들어 Python SDK는 초기 지연 시간 약 1초, 최대 지연 시간 60초로 일시적인 오류를 최대 4번 자동으로 재시도합니다. SDK에서 기본적으로 이 작업을 처리하지만 특정 워크로드에 더 적합하도록 이 동작을 구성할 수 있습니다.

재시도 시점 결정

커스텀 재시도 전략을 구현하기 전에 엔드포인트 선택, 결제 모델, 워크로드가 요구사항에 미치는 영향을 고려하세요.

적절한 엔드포인트 선택

  • 전역 엔드포인트: 가용성에 권장됩니다. 전역 엔드포인트는 트래픽을 동적으로 라우팅하므로 지역 용량 문제로 인해 발생하는 클라이언트 측 재시도의 필요성을 줄일 수 있습니다.
  • 지역 엔드포인트: 특정 위치로 제한됩니다. 리전에 과부하가 걸리면 즉시 재시도에 실패할 수 있습니다. 대신 장애 조치 전략을 고려하세요.

결제 모델 조정

  • 표준 사용한 만큼만 지불: 공유 리소스를 사용합니다. 지수 백오프를 사용하여 트래픽 급증으로 인해 발생하는 일시적인 비율 제한 오류 (429)를 처리합니다.
  • **유연한 사용한 만큼만 지불**: 우선순위가 낮고 처리 속도가 느린 경우에 적합합니다. 적극적으로 재시도하지 마세요. 대신 요청 시간 제한을 늘려 (예: 30분) 시스템이 작업을 완료할 시간을 제공합니다.
  • **우선순위 사용한 만큼만 지불**: 프로비저닝된 처리량의 사전 약정 없이 지연 시간에 민감하고 안정성이 높은 워크로드에 적합합니다. 이 등급에서 429 오류가 발생하면 지수 백오프로 재시도하되 할당량을 초과하지 않도록 하세요.
  • 프로비저닝된 처리량: 전용 용량을 사용합니다. 잦은 오류는 일반적으로 구매한 용량을 초과했음을 나타내므로 재시도를 추가해도 근본적인 문제가 해결되지 않을 수 있습니다.

지연 시간 허용치 정의

  • 실시간 (예: 채팅): 빠르게 실패합니다. 사용자가 응답을 무기한 기다리지 않도록 재시도 횟수를 제한합니다.
  • 일괄 추론: 개별 항목을 재시도하지 마세요. 일괄 서비스는 높은 완료율을 달성하기 위해 작업 내에서 개별 요청에 대한 재시도를 자동으로 처리합니다. 사용자는 작업을 한 번만 성공적으로 제출 하면 됩니다. 자세한 내용은 일괄 예측을 참고하세요.

재시도 가능한 오류 식별

요청을 재시도해도 안전한지 여부를 결정하는 두 가지 주요 요소는 다음과 같습니다.

응답

수신된 오류 코드 또는 응답은 문제가 일시적인지 영구적인지 나타냅니다. 일시적인 문제와 관련된 응답은 일반적으로 재시도 가능합니다. 예를 들면 다음과 같습니다.

  • HTTP 코드: 408 (요청 시간 초과), 429 (요청이 너무 많음), 5xx (서버 오류)
  • 네트워크 문제: 소켓 시간 초과 및 TCP 연결 해제

자세한 내용은 API 오류를 참고하세요.

멱등성

멱등성 요청은 리소스의 최종 상태를 변경하지 않고 반복적으로 실행할 수 있습니다. 멱등성을 결정할 때는 다음 사항을 고려하세요.

  • 항상 멱등성: 목록 작업 (리소스를 수정하지 않음), get 요청, 토큰 수 요청, 임베딩 요청
  • 멱등성이 없음: 새 조정 모델 만들기 등 성공할 때마다 고유한 리소스를 만드는 작업
  • 생성형 AI 미묘한 차이: 생성형 모델의 확률적 특성으로 인해 generateContent는 엄밀히 말하면 멱등성이 없지만 서버 측 상태를 수정하지 않으므로 일시적인 오류에 대해 재시도해도 일반적으로 안전합니다.

재시도 구성

Google 생성형 AI SDK를 사용하면 클라이언트 매개변수 또는 HttpRetryOptions를 통해 재시도 동작을 구성할 수 있습니다.

주요 매개변수

  • initial_delay: 첫 번째 재시도 전의 초기 지연 시간(초)(기본값: 1.0)
  • attempts: 최대 재시도 횟수 (기본값: 5)
  • exp_base: 지수 백오프 계산의 기준 (기본값: 2)
  • max_delay: 재시도 간의 최대 지연 시간(초)(기본값: 60)
  • jitter: 백오프에 임의 지연 시간을 추가하는 요소 (기본값: 1)
  • http_status_codes: 재시도를 트리거하는 상태 코드 목록

예시

클라이언트 수준 구성

클라이언트를 초기화할 때 전역으로 옵션을 설정할 수 있습니다.

Python

from google import genai
from google.genai import types

client = genai.Client(
    vertexai=True,
    project=PROJECT_ID,
    location="global",
    http_options=types.HttpOptions(
        retry_options=types.HttpRetryOptions(
            initial_delay=1.0,
            attempts=5,
            http_status_codes=[408, 429, 500, 502, 503, 504],
        ),
        timeout=120 * 1000,
    ),
)

자바

import com.google.genai.Client;
import com.google.genai.types.HttpOptions;
import com.google.genai.types.HttpRetryOptions;

HttpOptions httpOptions = HttpOptions.builder()
  .retryOptions(
      HttpRetryOptions.builder()
          .attempts(5)
          .httpStatusCodes(408, 429, 500, 502, 503, 504).build())
  .build();

Client client = Client.builder()
  .project(PROJECT_ID)
  .location("global")
  .vertexAI(true)
  .httpOptions(httpOptions)
  .build();

요청 수준 구성

config 매개변수를 사용하여 단일 요청의 설정을 재정의할 수도 있습니다.

Python

from google import genai
from google.genai import types

client = genai.Client(vertexai=True, project=PROJECT_ID, location="global")

response = client.models.generate_content(
    model="gemini-3-flash-preview",
    contents="Tell me a joke about a rabbit.",
    config=types.GenerateContentConfig(
        http_options=types.HttpOptions(
            retry_options=types.HttpRetryOptions(
                initial_delay=1.0,
                attempts=10,
                http_status_codes=[408, 429, 500, 502, 503, 504],
            ),
            timeout=120 * 1000,
        )
    )
)

유연한 사용한 만큼만 지불

유연한 사용한 만큼만 지불의 경우 처리 속도가 느리고 투명한 재시도로 인해 기본 시간 제한은 10분입니다. 사용자는 성공률을 높이기 위해 이 값을 30분으로 늘릴 수 있습니다.

Python

from google import genai
from google.genai import types

client = genai.Client(
  vertexai=True, project=PROJECT_ID, location='global',
  http_options=types.HttpOptions(
    api_version="v1",
      headers={
        "X-Vertex-AI-LLM-Request-Type": "shared",
        "X-Vertex-AI-LLM-Shared-Request-Type": "flex" # Use Flex PayGo
      },
      timeout = 30 * 60 * 1000 # Increase to 30 minutes
  )
)

권장사항 및 안티패턴

기본 재시도 메커니즘을 사용하든, 맞춤설정하든, 자체 재시도 로직을 구현하든 다음 권장사항을 따르고 일반적인 안티패턴을 피하세요.

권장사항

  • 지수 백오프 사용: 첫 번째 재시도 전에 잠시 기다린 후 (예: 1초) 지연 시간을 지수적으로 늘립니다 (예: 2초, 4초, 8초).
  • 지터 추가: 지연 시간에 임의의 "지터"를 추가하면 모든 클라이언트가 정확히 동시에 재시도하는 것을 방지할 수 있습니다.
  • 특정 오류에 대한 재시도: 일시적인 오류 (429, 408, 5xx)에 대해서만 재시도합니다.
  • 최대 재시도 횟수 설정: 무한 루프를 방지하기 위해 최대 재시도 횟수를 정의합니다.
  • 모니터링 및 로깅: 재시도 횟수, 오류 유형, 응답 시간에 관한 세부정보를 로깅하여 전략을 디버그합니다.

재시도 안티패턴

  • 백오프 없이 재시도: 즉시 재시도하면 연쇄 오류가 발생하고 서비스에 과부하가 걸릴 수 있습니다.
  • 재시도할 수 없는 오류 재시도: 클라이언트 오류 (4xx 429/408 이외의)는 잘못된 API 키 또는 잘못된 구문과 같은 문제를 나타내므로 재시도하지 마세요.
  • 멱등성이 없는 작업을 무조건 재시도: 멱등성이 없는 작업을 반복적으로 실행하면 리소스 중복과 같은 부작용이 발생할 수 있습니다.
  • 재시도 한도 무시: 무기한 재시도하면 리소스가 소진될 수 있습니다. 항상 최대 시도 횟수를 설정하세요.

다음 단계