서킷 브레이커(Circuit Breaker) 패턴: 마이크로서비스의 장애 격리와 시스템 탄력성 확보
마이크로서비스 아키텍처(MSA)에서는 수많은 서비스가 서로 API를 호출하며 복잡하게 얽혀 있습니다. 만약 이 중 핵심적인 서비스 하나가 응답 지연을 일으키거나 완전히 다운된다면 어떤 일이 벌어질까요? 그 서비스를 호출하던 다른 서비스들도 응답을 기다리느라 스레드가 고갈되고, 결국 장애가 도미노처럼 시스템 전체로 번지는 '연쇄 장애(Cascading Failure)'가 발생합니다. 서킷 브레이커(Circuit Breaker) 패턴은 전기 회로의 차단기처럼, 장애가 발생한 서비스로의 통신을 즉시 차단하여 시스템 전체의 붕괴를 막는 필수적인 방어 패턴입니다. 본 글에서는 서킷 브레이커의 작동 원리와 실무 도입 전략을 다룹니다. 1. 왜 서킷 브레이커가 시스템의 생존을 결정하는가 서킷 브레이커가 없다면, 장애가 발생한 서버를 호출하는 모든 클라이언트 서버는 요청을 재시도하거나 응답을 기다리며 대기합니다. 이 과정에서 클라이언트 서버의 리소스(메모리, 스레드)가 점유되고, 결국 호출하는 서버마저도 정상적으로 동작하지 않게 됩니다. 서킷 브레이커는 장애를 조기에 감지하고, 해당 서비스로의 요청을 즉시 '거절'함으로써 호출하는 측의 자원을 보호합니다. 이는 시스템이 완전히 마비되는 대신, 장애가 난 기능만 제한적으로 수행하지 못하도록 만들어 '우아한 성능 저하(Graceful Degradation)'를 실현합니다. 2. 서킷 브레이커의 3단계 동작 원리 서킷 브레이커는 항상 3가지 상태 사이를 오갑니다. 1) Closed(닫힘): 정상 상태입니다. 모든 요청은 호출 서비스로 전달됩니다. 실패율이 설정된 임계치(Threshold)를 넘기 전까지는 이 상태를 유지합니다. 2) Open(열림): 장애가 감지된 상태입니다. 모든 요청을 즉시 차단하고, 서버에 요청을 보내지 않은 채로 에러 응답(Fallback)을 반환합니다. 이 상태는 서버가 스스로 복구할 수 있는 시간적 여유를 줍니다. 3) Half-Open(반열림)...