연쇄 장애는 한 구성 요소의 실패가 다른 구성 요소의 오작동으로 이어지는 현상으로, 예를 들어 결제 처리 서비스의 응답 지연이 전체 Rails 애플리케이션을 마비시키는 시나리오를 통해 그 위험성을 강조합니다. 이러한 상황에서 사용자의 반복적인 재시도(retry storm)는 시스템 부하를 가중시켜 전반적인 서비스 중단을 초래할 수 있습니다.
서킷 브레이커 패턴은 이러한 연쇄 장애를 방지하기 위해 고안된 디자인 패턴으로, 물리적인 차단기와 유사하게 동작합니다. 외부 서비스 호출 시 발생하는 오류를 감시하여, 일정 임계치를 초과하면 해당 서비스로의 추가 호출을 일시적으로 차단합니다. 이는 시스템 리소스 낭비를 막고, 불안정한 서비스로부터 전체 시스템을 보호하는 역할을 합니다. 서킷 브레이커는 기본적으로 세 가지 상태를 가집니다:
- Closed (🟢 닫힘): 모든 것이 정상적으로 작동하며 요청이 원활하게 흐르는 상태입니다.
- Opened (🔴 열림): 너무 많은 오류가 발생하여 차단기가 작동한 상태로, 추가 호출이 차단되어 시스템 리소스를 보호합니다.
- Half-Opened (🟡 반-열림): 일정 시간(Cool-Off Time)이 지난 후, 서비스 복구를 테스트하기 위해 제한된 트래픽을 허용하는 중간 상태입니다. 성공 시 Closed로, 실패 시 Opened로 전환됩니다.
본문에서는 이러한 서킷 브레이커의 동작 원리를 Ruby 코드 예시를 통해 명확하게 설명합니다. 또한, 서킷 브레이커가 단순히 네트워크 호출뿐만 아니라 예측 불가능하거나 리소스 집약적인 모든 작업에 적용될 수 있음을 강조합니다.
Ruby 개발자를 위한 실용적인 솔루션으로 Stoplight 젬이 소개됩니다. Stoplight는 성능과 단순성에 중점을 두어 개발자가 복잡한 설정에 시간을 낭비하지 않고 비즈니스 로직에 집중할 수 있도록 돕습니다. Stoplight의 가장 큰 특징은 직관적인 ‘트래픽 라이트’ 개념을 도입하여 서킷 브레이커의 상태를 🟢(Green), 🔴(Red), 🟡(Yellow) 색상으로 시각화하여 혼란을 줄인다는 점입니다. 각 ‘라이트’는 특정 아웃바운드 경로를 제어하며, 고유한 이름을 통해 오류 기록 및 트래픽 관리가 이루어집니다.
Stoplight는 기본적으로 60초의 Cool-Off Time, 3회 연속 실패 시 Red 전환, 무제한 Window Size, 모든 StandardError 추적 등의 미션 준비 완료된 기본값을 제공합니다. 또한, 개발자는 전역 설정 또는 개별 라이트별로 skipped_errors
, threshold
, cool_off_time
, window_size
와 같은 파라미터를 조정하여 특정 오류를 무시하거나, 각 경로의 위험 허용 수준에 따라 민감도를 조절할 수 있습니다.
Stoplight Admin Panel은 시스템 내 모든 라이트의 실시간 상태를 모니터링하고 수동으로 제어할 수 있는 강력한 대시보드를 제공합니다. 이 대시보드는 Rails 애플리케이션에 직접 마운트하거나 독립형 서비스로 배포할 수 있어, E2E 테스트, 로컬 디버깅, 실시간 장애 대응 등 다양한 시나리오에서 유용하게 활용됩니다.