본문 바로가기
C.W.K.
Stream
Lesson 04 of 06 · published

재시도·회로 차단기·예비 경로는 서로 다른 실패를 막아

~14 min · retries, reliability, circuit-breaker

Level 0Observer
0 XP0/64 lessons0/13 achievements
0/150 XP to next level150 XP to go0% complete

실패 종류부터 갈라

4xx처럼 요청 자체가 잘못된 영구 실패는 다시 보내면 안 돼. 5xx와 529 같은 일시 실패는 지수 백오프 뒤에 재시도하고, 429는 retry-after를 따라야 해. SDK의 자동 예산을 넘긴 뒤 어떤 행동을 할지는 제품이 정해.

상류 장애에는 회로를 열어

Claude API 상태가 나쁠 때 즉시 재시도를 몰아치면 장애를 키워. 연속 N회 실패 뒤 회로 차단기를 열고, 식힘 시간 동안 호출을 막은 뒤 반개방 상태에서 회복을 시험해. 그동안 Haiku, Bedrock의 Sonnet, 큐에 넣은 재시도 같은 예비 경로로 넘길 수 있어.

cwkPippa는 저하 시간을 정상 조건으로 봐

cwkPippa의 운영 규칙은 하루 약 4시간의 저하도 일어날 수 있다고 가정해. 그래서 Codex → Claude → Gemini 예비 사슬은 나중에 붙일 장식이 아니라 첫 버전의 요구사항이야. 상류가 항상 정상이라는 전제를 버려야 실패가 사용자 경험 전체를 삼키지 않아.

원칙: 재시도는 짧은 흔들림을 넘겨. 지속 장애는 회로 차단기와 예비 경로가 다뤄.

Code

Simple circuit breaker·python
import time

class Breaker:
    def __init__(self, threshold=5, cool_down=30):
        self.fails = 0
        self.opened_at = 0
        self.threshold = threshold
        self.cool_down = cool_down

    def allow(self) -> bool:
        if self.fails < self.threshold:
            return True
        return (time.time() - self.opened_at) > self.cool_down

    def record(self, ok: bool):
        if ok:
            self.fails = 0
        else:
            self.fails += 1
            if self.fails == self.threshold:
                self.opened_at = time.time()

breaker = Breaker()

def call_with_breaker(*args):
    if not breaker.allow():
        return fallback(*args)
    try:
        out = client.messages.create(*args)
        breaker.record(True)
        return out
    except Exception:
        breaker.record(False)
        raise
Provider fallback chain·python
def call_with_fallback(messages):
    try:
        return claude_sonnet(messages)
    except (RateLimitError, InternalServerError):
        try:
            return claude_haiku(messages)  # 더 싼 Anthropic 모델
        except Exception:
            return openai_gpt(messages)  # cross-provider 마지막 수단

External links

Exercise

중요 Claude 호출 하나에 모델 하향·제공자 전환·Batch 큐 중 하나의 예비 경로를 넣어. 주 경로를 강제로 실패시키고 실제 전환과 사용자 약속을 확인해.
Hint
분기마다 숨은 버그가 있으니 분기별 장애 훈련을 분기마다 한 번 이상 잡아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.