분산 시스템에서는 결국 모든 것이 실패합니다. 복원력 패턴은 하나의 장애가 전체 장애로 연쇄(cascade)되는 것을 막습니다.
const breaker = new CircuitBreaker(callPaymentService, {
timeout: 3000, // 3초 후 호출 실패 처리
errorThresholdPercentage: 50, // 호출의 50% 초과 실패 시 open
resetTimeout: 10000 // 10초 후 요청 하나 시도(half-open)
});
breaker.fallback(() => ({ status: 'queued' })); // 우아한 성능 저하
CLOSED ──(실패가 임계치 초과)──▶ OPEN
▲ │ (resetTimeout 후)
│ (시험 성공) ▼
└────────────── HALF-OPEN ◀──────────────┘
(시험 요청 하나)
[ pool A: 스레드 10개 ] → 결제 호출
[ pool B: 스레드 10개 ] → 검색 호출
검색이 멈추면 pool B만 고갈 — 결제는 계속 동작.
백오프 없는 재시도는 이미 고전 중인 서비스에 부하를 증폭시킵니다(재시도 폭풍, retry storm). 항상 백오프, 지터, 재시도 상한을 추가하세요.
이 패턴들은 불가피한 단일 서비스 장애를 사이트 전체 장애 대신 기능 저하로 바꾸는 요소입니다.
이들은 함께 동작합니다. 타임아웃은 대기를 제한하고, circuit breaker는 죽은 서비스를 두드리는 것을 멈추며, bulkhead는 영향 범위를 가두고, retry는 일시적 장애에서 회복합니다. 하나라도 빠지면 장애는 여전히 연쇄됩니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기