170. 서킷 브레이커 (Circuit Breaker) 패턴

핵심 인사이트: 전봇대에 번개가 치면 두꺼비집(차단기)이 먼저 '딱!' 하고 떨어져 집 안의 가전제품들을 보호한다. 마이크로서비스에서도 A 서비스가 고장 나면, 계속 호출하며 기다리다 B, C 서비스까지 연쇄 폭발(Cascading Failure)하는 것을 막기 위해 연결을 즉시 끊어버리는 내결함성(Resilience) 아키텍처다.

Ⅰ. MSA 환경의 연쇄 장애 (Cascading Failure) 위험성

마이크로서비스 아키텍처(MSA)에서는 하나의 사용자 요청을 처리하기 위해 수십 개의 서비스가 거미줄처럼 서로를 호출합니다. 만약 '결제 서비스' 가 DB 과부하로 인해 응답하지 못하고 멈춰있다면, 결제를 호출한 '주문 서비스' 들은 응답을 기다리며(Timeout 대기) 쓰레드(Thread)를 붙잡고 있게 됩니다. 결국 주문 서비스도 멈추고, 주문을 호출한 게이트웨이도 멈추면서 단 하나의 서비스 장애가 도미노처럼 시스템 전체를 무너뜨리는 참사(연쇄 장애) 가 발생합니다.

Ⅱ. 서킷 브레이커 (Circuit Breaker) 패턴의 개념

호출하는 타겟 서비스에 장애가 발생했거나 지연율이 임계치를 넘으면, 프록시(서킷 브레이커)가 이를 감지하고 장애가 난 서비스로의 호출을 원천 차단(회로 차단)하여 Fail Fast(즉시 에러 반환) 함으로써 대기 쓰레드의 적체를 막고 시스템 전체의 붕괴를 방어하는 아키텍처 패턴입니다. (대표 도구: Netflix Hystrix, Resilience4j)

Ⅲ. 서킷 브레이커의 3가지 상태 (State Machine)

마치 실제 전기 회로 차단기처럼 동작합니다.

       (장애 임계치 도달!)
[ CLOSED ] ────────────▶ [ OPEN ]
 (정상)                    (차단)
   ▲                         │ (일정 시간 대기 후 테스트)
   │                         ▼
   └──────── [ HALF-OPEN ] ──┘
      (성공!)   (반열림)    (실패!)
  1. CLOSED (정상/닫힘): 회로가 닫혀 전기가 통하듯, 정상적으로 타겟 서비스를 호출합니다. 에러율이 임계치(예: 10초 내 에러율 50% 이상)에 도달하는지 계속 감시합니다.
  2. OPEN (장애/열림): 에러가 폭증하면 차단기가 내려가듯 회로를 엽니다. 이제부터 들어오는 모든 요청은 타겟 서비스로 보내지 않고 즉시 에러(또는 Fallback) 로 튕겨냅니다. (타겟 서비스가 회복할 시간을 줍니다).
  3. HALF-OPEN (반열림): OPEN 상태에서 일정 시간(예: 30초)이 지나면, 서킷 브레이커가 조심스럽게 회로를 살짝 열어봅니다(몇 개의 요청만 흘려보냄).
    • 여기서 성공하면 타겟이 회복되었다고 판단하여 다시 CLOSED로 돌아갑니다.
    • 또 실패하면 아직 아프다고 판단하여 다시 얄짤없이 OPEN 상태로 닫아버립니다.

Ⅳ. 왜 유용한가?

서킷 브레이커가 없으면 클라이언트는 무한정 로딩 창(모래시계)을 보게 되지만, 서킷 브레이커가 도입되면 즉시 "현재 결제 시스템에 장애가 있습니다. 잠시 후 시도해 주세요" 라는 빠른 피드백(Fail Fast)을 줄 수 있어 고객 경험(UX) 측면에서도 매우 훌륭합니다.

📢 섹션 요약 비유: 집에 과전류가 흘렀을 때 두꺼비집 스위치가 떨어지지 않으면 비싼 TV와 냉장고가 다 타버립니다(연쇄 장애). 두꺼비집(서킷 브레이커)이 "이상 감지!" 하고 즉시 전기를 끊어버리면(OPEN), 비록 TV는 당장 못 보지만 집 전체가 불타는 대참사는 막아내는 자기방어 시스템입니다.