[MSA] 서킷 브레이커: 장애 전파를 막는 '안전벨트' (Resilience4j)
📌 핵심 요약
- MSA 환경에서 발생하는 연쇄 장애(Cascading Failure)의 위험성
- 서킷 브레이커의 3가지 상태: Closed, Open, Half-Open
- Resilience4j를 활용한 Spring Boot 적용 코드 및 Fallback 전략
마이크로서비스 아키텍처(MSA)는 서비스 간의 통신으로 이루어집니다. 만약 서비스 A가 서비스 B를 호출했는데, B가 데이터베이스 과부하로 응답을 주지 못하고 있다면 어떻게 될까요?
서비스 A의 스레드(Thread)들은 B의 응답을 하염없이 기다리게 됩니다(Waiting). 결국 A의 스레드 풀까지 고갈되면서, 멀쩡하던 A 서비스마저 멈추게 됩니다. 이를 연쇄 장애(Cascading Failure)라고 합니다. 이 재앙을 막기 위한 장치가 바로 서킷 브레이커(Circuit Breaker)입니다.
1. 작동 원리: 3가지 상태 머신
집에 있는 두꺼비집(누전 차단기)과 원리가 똑같습니다. 과부하가 걸리면 회로를 끊어서 집 전체가 타버리는 것을 막습니다. 서킷 브레이커는 다음 3가지 상태를 오가며 시스템을 보호합니다.
| 상태 (State) | 의미 | 동작 방식 |
|---|---|---|
| 🟢 CLOSED | 정상 (닫힘) | 전류가 잘 흐르는 상태. 외부 서비스로 요청을 정상적으로 보냅니다. |
| 🔴 OPEN | 차단 (열림) | 에러율이 임계치(예: 50%)를 넘으면 발동. 요청을 아예 보내지 않고 즉시 에러를 반환하여 대기 시간을 없앱니다. |
| 🟡 HALF-OPEN | 간보기 | 일정 시간이 지난 후, 요청을 한두 개만 살짝 보내봅니다. 성공하면 CLOSED로 복구, 실패하면 다시 OPEN으로 돌아갑니다. |
2. Resilience4j 적용 실전 (Spring Boot)
과거에는 Netflix Hystrix를 많이 썼지만, 현재는 유지보수 모드입니다. Spring Boot 3.x 시대의 표준은 Resilience4j입니다. 가볍고 함수형 프로그래밍을 지원합니다.
설정 (application.yml)
코드 적용 (@CircuitBreaker)
핵심은 Fallback(대안) 메서드입니다. 서킷이 열렸을 때 고객에게 "에러 화면"을 보여주는 대신, "기본값"이나 "캐시된 데이터"를 보여주어 사용자 경험을 유지해야 합니다.
3. 결론: "실패를 설계하라"
서킷 브레이커는 장애를 막아주는 도구가 아니라, 장애가 발생했을 때 시스템 전체가 죽는 것을 막아주는 격리벽(Bulkhead)입니다.
MSA를 도입했다면 "외부 서비스는 언제든 죽을 수 있다"는 가정하에, 서킷 브레이커와 적절한 Fallback 전략을 반드시 마련해 두어야 합니다. 그것이 밤에 편안하게 잠들 수 있는 유일한 방법입니다.