본문으로 건너뛰기
김신건의 로그

[Concurrency] Circuit Breaker: cascade failure 방어

· 수정 · 📖 약 1분 · 416자/단어 #circuit-breaker #resilience #fault-tolerance #microservices #backend
Circuit Breaker, Hystrix, Resilience4j, Polly, Sentinel, half-open, fail-fast

정의

Circuit Breaker = 전기 회로의 차단기처럼, 백엔드 다운 / 느림 시 호출 자체를 차단빠른 실패 + 백엔드 회복 시간.

3가지 상태

stateDiagram-v2
    [*] --> Closed
    Closed --> Open: 실패율 임계 초과
    Open --> HalfOpen: 대기 시간 경과
    HalfOpen --> Closed: 성공 N회
    HalfOpen --> Open: 실패 1회
상태의미동작
Closed정상모든 호출 통과, 실패 카운트
Open차단호출 안 함, 즉시 fail (또는 fallback)
Half-Open시험제한된 호출 시도, 성공/실패로 다음 상태

시나리오

sequenceDiagram
    autonumber
    participant Client
    participant CB as Circuit Breaker
    participant Backend

    Note over CB: Closed
    Client->>CB: call
    CB->>Backend: ✓ OK
    Backend-->>CB: ✓
    Client->>CB: call
    CB->>Backend: ✗ Fail
    Note over CB: 실패 누적 (3/10)
    Client->>CB: call
    CB->>Backend: ✗ Fail
    Note over CB: 실패율 50% > 임계 → OPEN
    Client->>CB: call
    CB-->>Client: ❌ fail-fast (호출 안함)
    Note over CB: 30초 대기 (Open)
    Note over CB: Half-Open 으로 전환
    Client->>CB: call
    CB->>Backend: ✓ OK
    Note over CB: 성공 → Closed

트리거 조건

옵션의미
Failure rate실패율 > X% (sliding window)
Slow call rateN초 이상 응답 비율 > X%
Consecutive failures연속 N회 실패

라이브러리

라이브러리언어비고
Resilience4jJavaHystrix 후계
Polly.NET표준
SentinelJava/GoAlibaba
pybreakerPython단순
opossumNodeEventEmitter 친화
Envoy outlier detectionproxysidecar 자동

Hystrix vs Resilience4j

Hystrix (2018 EOL)Resilience4j
Thread pool 격리기본옵션
SemaphoreOKOK
Reactive일부기본
LightweightXO (8 MB)
활성 개발XO

Fallback

@circuit_breaker(name="payment")
def call_payment():
    return external.charge()

@call_payment.fallback
def cached_response():
    return { "status": "queued" }   # degraded but usable

단순 fail-fast 보다 부분적이라도 응답사용자 경험 에 좋다. 단 잘못된 캐시 응답이 위험 한 영역 (결제 / 재고) 은 금지.

Bulkhead 와의 조합

flowchart TB
    subgraph App
        TPA["Thread Pool A (CB-A)<br/>→ Payment Service"]
        TPB["Thread Pool B (CB-B)<br/>→ Inventory Service"]
        TPC["Thread Pool C (CB-C)<br/>→ Shipping Service"]
    end
    Note[하나 다운 = 자기 Pool 만 영향]

자세한 건 backpressure 의 Bulkhead.

Envoy / Istio outlier detection

서비스 메시 레벨에서 자동 CB. 코드 변경 없이 적용:

# Istio DestinationRule
spec:
  trafficPolicy:
    outlierDetection:
      consecutive5xxErrors: 5
      interval: 30s
      baseEjectionTime: 30s

흔한 함정

WARNING

  1. 임계가 너무 민감 = 일시 jitter 로 false open. 짧은 window 에서 조심.
  2. Half-Open 호출 다수 동시 = 한 번에 모든 호출 통과 → 다시 다운. 동시 호출 1개 또는 적은 수.
  3. Fallback 이 다른 backend 호출 = fallback 도 다운되면 재귀 fail. fallback 은 로컬 / 캐시 only.
  4. CB 메트릭 누락 = open 상태인지 운영자가 모름. 알림 필수.

관련 위키

이 글의 용어 (4개)
[Auth] mTLS (Mutual TLS): 양방향 인증서 인증auth-security
정의 mTLS (Mutual TLS) 는 서버뿐 아니라 클라이언트도 TLS 인증서로 자기 신분 증명. 일반 TLS = 서버 인증만, mTLS = 양방향. 활용: 서비스 메시 (I…
[Concurrency] Backpressure: 흐름 제어로 시스템 보호concurrency
정의 Backpressure = 생산자가 소비자 속도에 맞춰 자기 속도 조절. 분산 시스템의 cascade failure 방지. [!IMPORTANT] Backpressure 의…
[Concurrency] Retry + Exponential Backoff + Jitterconcurrency
정의 Retry with Exponential Backoff + Jitter = 실패 시 점점 긴 간격으로 재시도, 랜덤 분산. 분산 시스템의 thundering herd / r…
[Pattern] API Gateway: BFF, 라우팅, auth, rate limitdistributed-systems
정의 API Gateway = 클라이언트와 마이크로서비스 사이의 단일 진입점. 라우팅, auth, rate limit, transformation, monitoring 의 cro…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기