1. Circuit Breaker 패턴 소개
- 현대의 분산 시스템에서는 여러 서비스가 네트워크를 통해 서로 통신합니다.
- Michael Nygard의 "Release It"에서 소개된 Circuit Breaker 패턴은 이러한 분산 환경에서 발생할 수 있는 연쇄적인 장애를 예방하는 핵심적인 디자인 패턴입니다.
1.1 Circuit Breaker가 필요한 이유
- 원격 호출은 네트워크 지연, 서비스 불능 등으로 실패하거나 타임아웃될 수 있습니다.
- 응답하지 않는 서비스에 많은 호출이 집중되면 중요한 시스템 리소스가 고갈될 수 있습니다.
- 한 서비스의 장애가 의존성이 있는 다른 서비스로 전 파되어 전체 시스템이 마비될 수 있습니다.
- 특히 마이크로서비스 아키텍처에서는 장애의 근본 원인을 찾기가 더욱 어려워집니다.
정보
Circuit Breaker는 전기 회로의 차단기처럼 장애가 발생한 서비스를 격리하여 전체 시스템을 보호합니다.
2. Circuit Breaker의 동작 원리
- Circuit Breaker는 원격 호출을 감싸는 상태 기계(State Machine)로 구현됩니다.
- 호출의 성공과 실패를 모니터링하다가 실패율이 임계치를 넘으면 자동으로 회로를 차단합니다.
2.1 Circuit Breaker의 상태

- Circuit Breaker는 다음 세 가지 상태를 가집니다:
- CLOSED (닫힘)
- 정상 상태로, 모든 요청이 보호된 서비스 로 전달됩니다
- 실패를 계속 모니터링하며 실패율 계산
- 임계치 초과 시 OPEN 상태로 전환
- OPEN (열림)
- 회로가 차단된 상태
- 모든 요청이 즉시 에러를 반환 (Fail Fast)
- 설정된 시간 경과 후 HALF-OPEN 상태로 전환
- HALF-OPEN (반열림)
- 회로 재연결을 시도하는 상태
- 제한된 수의 테스트 요청 허용
- 성공 시 CLOSED, 실패 시 OPEN으로 전환
2.2 실패율(Failure Rate) 계산
경고
실패율 계산과 임계치 설정은 Circuit Breaker 구현의 핵심입니다.
- 실패율 모니터링은 다음 요소들을 고려합니다:
- Failure Rate Threshold: 회로를 차단하는 실패율 임계치
- Minimum Request Threshold: 실패율 계산에 필요한 최소 요청 수
- Sliding Window: 실패율을 계산하는 시간 단위
3. Circuit Breaker 구 현 시 고려사항
3.1 오류 처리
- 모든 오류가 회로를 차단해야 하는 것은 아닙니다
- 정상적인 비즈니스 로직상의 실패는 제외
- 네트워크 연결 실패, 타임아웃 등 인프라 관련 오류에 집중
3.2 비동기 처리
- 동기식 호출뿐만 아니라 비동기 통신에도 Circuit Breaker 적용 가능
- 메시지 큐를 사용하는 경우 큐가 가득 찰 때 회로 차단
- Thread Pool을 사용한 병렬 처리에서 풀 고갈 시 차단
3.3 모니터링과 알림
- Circuit Breaker 상태 변경은 반드시 로깅
- 상태 모니터링을 위한 메트릭 수집
- 회로 차단 시 운영팀에 즉시 알림
- 수동으로 회로를 차단하거나 재설정할 수 있는 관리 인터페이스 제공