핵심 인사이트 (3줄 요약)

  1. 본질: 서드파티 API (Application Programming Interface) 통신에서 지수 백오프 + 지터 (Jitter) 전략은 재시도 폭풍(Thundering Herd)을 방지하면서 일시적 장애를 자동 복구하는 내결함성 통신 설계 패턴이다.
  2. 가치: 서킷 브레이커 (Circuit Breaker) 패턴과 폴백 (Fallback) 전략을 결합하면, 의존 서비스 장애 시 자신의 서비스 품질 저하를 최소화하고 의존 서비스의 회복 속도를 보호할 수 있다.
  3. 판단 포인트: 재시도 예산(Retry Budget), 타임아웃 계층(연결/읽기/쓰기 타임아웃), 서킷 브레이커 상태 천이(Closed→Open→Half-Open) 설계가 실무 판단의 핵심 트레이드오프다.

Ⅰ. 개요 및 필요성

분산 시스템에서 서드파티 API(결제, 지도, 인증, AI 추론 등)는 외부 의존성의 전형이다. 이 의존성이 장애를 겪을 때 단순 재시도(Naive Retry)를 쓰면 장애 서비스에 재시도 요청이 폭증해 복구를 더 어렵게 만드는 재시도 폭풍(Thundering Herd)이 발생한다.

2012년 AWS DynamoDB 장애 복구가 재시도 폭풍으로 지연된 사례, Netflix가 서킷 브레이커 없이 Hystrix 이전 단계에서 겪은 연쇄 장애(Cascading Failure) 사례가 이 문제의 실증이다. 단순 재시도는 해결책이 아니라 장애를 증폭시킨다.

지수 백오프(Exponential Backoff)는 재시도 간격을 2^n 형태로 늘려 부하를 분산한다. 그러나 여러 클라이언트가 동시에 같은 간격으로 재시도하면 동기화된 부하 폭발이 발생한다. 지터(Jitter)는 재시도 간격에 무작위 값을 더해 이 동기화를 깨뜨린다. Full Jitter 전략은 sleep = random(0, min(cap, base * 2^attempt))로 계산된다.

  • 📢 섹션 요약 비유: 재시도 폭풍은 정전 복구 후 에어컨이 동시에 켜지는 것과 같다. 지터는 에어컨이 무작위 간격으로 켜지게 해 전력망을 보호한다.

Ⅱ. 아키텍처 및 핵심 원리

┌───────────────────────────────────────────────────────────────────┐
│               서킷 브레이커 상태 천이                             │
├───────────────────────────────────────────────────────────────────┤
│  [Closed] ──실패율 임계 초과──▶ [Open] ──대기시간 후──▶ [Half-Open]│
│     ▲                              │                     │        │
│     │         즉시 폴백 응답       │  테스트 요청 성공 → │        │
│     └──────────────────────────────┘       Closed 복귀   │        │
│                                            실패 → Open   │        │
└───────────────────────────────────────────────────────────────────┘
상태동작전환 조건
Closed정상 통신, 실패율 모니터링실패율 > 임계값 (예: 50%, 10초)
Open즉시 폴백 반환, 외부 호출 없음대기 시간 경과 (예: 30초)
Half-Open제한적 테스트 요청 허용성공 → Closed, 실패 → Open

지수 백오프 + 지터 비교

전략재시도 간격 계산특징
No Jittermin(cap, base * 2^n)동기화 부하 폭발 위험
Full Jitterrandom(0, min(cap, base * 2^n))최대 분산, 권장
Decorrelatedrandom(base, prev_sleep * 3)이전 간격 기반, 균일 분산

폴백 전략 유형: 캐시 응답(Stale-While-Revalidate), 기본값 반환(Stub Response), 기능 축소 모드(Degraded Mode), 큐 지연 처리(Queue-and-Retry). 결제처럼 멱등성이 없는 API는 폴백 대신 큐 지연 처리가 안전하다.

  • 📢 섹션 요약 비유: 서킷 브레이커는 집의 두꺼비집과 같다. 과전류 시 차단기가 내려가 전기 시스템(서비스) 전체를 보호하고, 문제가 해결된 후 조심스럽게(Half-Open) 다시 올린다.

Ⅲ. 비교 및 연결

항목단순 재시도지수 백오프 + 지터서킷 브레이커
목적일시적 오류 복구재시도 부하 분산연쇄 장애 차단
외부 영향장애 서비스 부하 증폭분산 증가, 부하 감소요청 차단으로 완전 보호
구현 복잡도낮음중간높음 (상태 관리 필요)
병용 가능 여부-서킷 브레이커와 함께 사용백오프와 함께 사용

벌크헤드 (Bulkhead) 패턴은 스레드 풀 격리를 통해 특정 의존성 장애가 전체 시스템으로 전파되지 않도록 막는다. 타임아웃 계층은 연결 타임아웃(TCP handshake, <1초), 읽기 타임아웃(응답 수신, <5초), 쓰기 타임아웃(요청 전송)을 별도 설정한다.

  • 📢 섹션 요약 비유: 지수 백오프는 문을 두드릴 때 점점 더 오래 기다리는 것이고, 서킷 브레이커는 아예 노크를 멈추고 집 앞을 떠나는 결정이다. 둘 다 없으면 문이 부서질 때까지 두드린다.

Ⅳ. 실무 적용 및 기술사 판단

재시도 설계 체크리스트

  1. 멱등성(Idempotency) 확인: 멱등하지 않은 API는 재시도 전 식별자 발급 필요
  2. 재시도 예산(Retry Budget): 전체 요청의 10% 이하로 재시도 총량 제한
  3. 타임아웃 계층 분리: 연결/읽기/쓰기 타임아웃을 각각 독립 설정
  4. 폴백 응답 신선도: 캐시 폴백의 TTL (Time To Live)과 스테일(Stale) 허용 범위 정의
  5. 서킷 브레이커 임계값: 실패율(%), 슬라이딩 윈도우(초), Half-Open 테스트 요청 수 설정

판단 기준

  • 결제, 주문 API (비멱등): 재시도 없이 큐 지연 처리 + 폴백 = "나중에 처리"
  • 조회 API (멱등): Full Jitter 백오프 + 서킷 브레이커 + 캐시 폴백
  • AI 추론 API (고지연): 타임아웃 공격적 설정 + 서킷 브레이커 Open 시 기본 모델 폴백

안티패턴

  • 재시도 횟수만 설정하고 간격 분산 없음 → Thundering Herd 재발

  • 서킷 브레이커 없이 폴백만 구현 → 장애 서비스 계속 호출로 복구 지연

  • 연결 타임아웃과 읽기 타임아웃을 동일하게 설정 → 느린 응답과 연결 실패 구분 불가

  • 📢 섹션 요약 비유: API 재시도 설계는 소방 훈련과 같다. 화재(장애) 시 모든 사람이 동시에 계단을 달리면 혼잡해지므로, 층별로 순서를 나눠(지터) 안전하게 대피한다.


Ⅴ. 기대효과 및 결론

지수 백오프 + 지터 + 서킷 브레이커 조합은 일시적 장애에 대한 자동 회복력과 연쇄 장애 방어를 동시에 달성한다. Netflix Hystrix, Resilience4j, AWS SDK의 기본 재시도 전략 모두 Full Jitter를 적용하며, 이를 통해 DynamoDB 장애 복구 시간을 수십 분에서 수 분으로 단축한 사례가 있다.

한계로는 서킷 브레이커 임계값 튜닝이 잘못되면 정상 트래픽에서 Open 상태로 전환되는 오탐(False Positive)이 발생한다. 또한 폴백 응답이 잘못 설계되면 "가짜 성공"처럼 보이는 불완전한 응답이 데이터 불일치를 유발한다.

미래 방향은 서비스 메시(Istio, Envoy)가 이 모든 패턴을 애플리케이션 코드 외부에서 자동 처리하는 방향이다. 사이드카 프록시 수준에서 재시도·서킷 브레이커·타임아웃을 선언적으로 설정해, 애플리케이션은 비즈니스 로직에만 집중한다.

  • 📢 섹션 요약 비유: 서킷 브레이커와 백오프는 방어 운전의 두 기술이다. 백오프는 앞차와의 거리를 늘리는 것이고, 서킷 브레이커는 사고 구간에서 우회로를 찾는 결정이다.

📌 관련 개념 맵

개념연결 포인트
서킷 브레이커 (Circuit Breaker)연쇄 장애 차단, Closed/Open/Half-Open 상태 관리
Bulkhead (벌크헤드)스레드 풀 격리로 장애 전파 차단
Retry Budget (재시도 예산)전체 트래픽 대비 재시도 비율 상한 제어
Hystrix / Resilience4jJVM 기반 서킷 브레이커·벌크헤드 라이브러리
서비스 메시 (Istio/Envoy)인프라 수준 재시도·서킷 브레이커 자동화
SLO (Service Level Objective)재시도 예산이 SLO 달성과 직결되는 연결 고리

📈 관련 키워드 및 발전 흐름도

단순 재시도 (Naive Retry) — 장애 증폭 위험
    │
    ▼
지수 백오프 (Exponential Backoff) — 부하 분산
    │
    ▼
지터 (Full Jitter) — Thundering Herd 제거
    │
    ▼
서킷 브레이커 (Circuit Breaker) — 연쇄 장애 차단
    │
    ▼
폴백 (Fallback) + 벌크헤드 (Bulkhead) — 그레이스풀 디그레이드
    │
    ▼
서비스 메시 (Istio/Envoy) — 인프라 레벨 자동화

흐름은 "재시도 증폭 → 분산 제어 → 차단 → 격리 → 인프라 자동화"로 진화한다.

👶 어린이를 위한 3줄 비유 설명

  1. API가 응답을 안 할 때 계속 두드리면 서버가 더 힘들어져요. 그래서 기다리는 시간을 점점 늘려요(지수 백오프).
  2. 지터는 여러 친구가 동시에 문을 두드리지 않도록 각자 다른 시간에 두드리게 하는 거예요.
  3. 서킷 브레이커는 "이 문은 고장났어"라고 판단하면 아예 두드리지 않고 다른 길을 찾는 현명한 결정이에요.