Circuit Breaker 패턴의 정의
Circuit Breaker(서킷 브레이커)는 마이크로서비스나 외부 API를 호출할 때, 특정 서비스가 계속 실패하고 있다면 더 이상 요청을 보내지 않고 즉시 실패 응답을 반환하는 장애 격리 패턴입니다. 이름 그대로 전기 회로의 차단기에서 유래했는데, 과전류가 흐르면 두꺼비집이 내려가 전체 회로를 보호하듯, 소프트웨어에서도 장애가 발생한 서비스로의 호출을 끊어서 장애가 다른 서비스까지 번지는 것을 막습니다.
예를 들어 주문 서비스가 결제 서비스를 호출하는데 결제 서비스가 응답 지연이나 오류를 반복한다고 가정해봅시다. Circuit Breaker가 없다면 주문 서비스는 결제 서비스의 응답을 계속 기다리며 스레드와 커넥션을 소모하다가, 결국 주문 서비스 자체도 다운되는 연쇄 장애(cascading failure)가 발생할 수 있습니다.
동작 원리: 세 가지 상태
Circuit Breaker는 보통 세 가지 상태를 오가며 동작합니다.
Closed: 평상시 상태로, 모든 요청이 정상적으로 전달됩니다. 실패율을 계속 모니터링합니다.Open: 실패율이 임계치(예: 50% 이상 실패)를 넘으면 회로가 열리고, 이후 요청은 실제 호출 없이 즉시 실패 처리되거나 대체 응답(fallback)을 반환합니다.Half-Open: 일정 시간이 지나면 회로가 반쯤 열려, 일부 요청만 시험적으로 실제 서비스에 보내봅니다. 이 요청들이 성공하면 다시 Closed 상태로 돌아가고, 여전히 실패하면 다시 Open 상태로 돌아갑니다.
이 과정을 비유하면, 계속 넘어지는 사람에게 무리하게 다시 뛰라고 시키지 않고 ‘일단 잠깐 쉬었다가, 괜찮아졌는지 살짝 걸어보게 한 뒤’ 문제없으면 다시 뛰게 하는 것과 비슷합니다.
실무에서 왜 사용하는가
분산 시스템에서는 하나의 서비스 장애가 전체 시스템 장애로 번지는 경우가 흔합니다. Circuit Breaker를 적용하면 장애가 난 서비스에 대한 불필요한 호출을 줄여 응답 시간을 단축하고, 정상 서비스의 자원(스레드, 커넥션 풀)을 보호할 수 있습니다. 또한 Open 상태일 때 캐시된 데이터나 기본값을 반환하는 fallback 로직을 함께 구성하면 사용자 경험 저하도 최소화할 수 있습니다.
대표적으로 Netflix Hystrix(현재는 Resilience4j가 주로 사용됨), Spring Cloud Circuit Breaker 등의 라이브러리가 이 패턴을 구현하고 있으며, MSA 환경에서 안정성을 높이는 핵심 요소로 자리 잡았습니다.