MSA
5 - 서킷브레이커
by 젼젼39
2026. 2. 23.
1. 서킷 브레이커 개요
- 1-1) 서킷 브레이커의 정의와 역할
- 마이크로서비스 간의 통신 장애를 감지하여 전체 시스템의 붕괴를 막는 장애 차단기 역할을 수행
- 외부 서비스가 응답하지 않거나 오류를 발생시킬 때, 무작정 기다리는 대신 빠른 실패(Fail-fast)를 유도하여 시스템의 복원력을 높임
- 주요 메커니즘: 상태 감지(Monitoring) → 회로 차단(Isolation) → 복구 시도(Recovery)
2. Resilience4j 상세 가이드
- 2-1) Resilience4j란?
- 넷플릭스 Hystrix의 중단 이후 스프링 생태계의 표준이 된 서킷 브레이커 라이브러리
- 경량화된 구조를 지향하며, 서비스 간 호출 실패를 제어하여 시스템의 연속성을 보장함
- 2-2) 서킷 브레이커의 3가지 상태 변화
- 클로즈드(Closed): 회로가 닫힌 정상 상태임. 모든 요청이 통과되며, 내부적으로 실패율을 모니터링함
- 예: 실패율 임계값이 50%일 때, 5번 중 3번 실패하면 오픈 상태로 즉시 전환됨
- 오픈(Open): 장애 발생 시 회로를 열어 모든 요청을 즉시 차단함
- 서버 부하를 줄이기 위해 에러 응답(Fallback)을 즉시 반환하며, 설정된 대기 시간만큼 유지됨
- 하프-오픈(Half-Open): 장애 복구 여부를 판단하는 중간 단계
- 제한된 수의 요청(예: 3회)만 허용하여 모두 성공하면 다시 클로즈드 상태로, 하나라도 실패하면 다시 오픈 상태로 돌아감
3. Resilience4j 설치 및 환경 설정
- 3-1) 프로젝트 의존성 구성
- Spring Boot 3 버전과의 호환성을 고려하여 특정 라이브러리와 AOP를 함께 추가함
// build.gradle 예시 (Boot3 전용 라이브러리 사용 주의)
dependencies {
implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
implementation 'org.springframework.boot:spring-boot-starter-aop'
}
- 3-2) 세부 구성 옵션 (
application.yml)
- 서킷 브레이커의 동작 방식과 임계치를 세부적으로 조정함
resilience4j:
circuitbreaker:
configs:
default:
registerHealthIndicator: true # 헬스 체크 엔드포인트에 상태 노출
slidingWindowType: COUNT_BASED # 호출 횟수를 기준으로 상태 결정
slidingWindowSize: 5 # 통계 산출을 위한 최근 호출 수
minimumNumberOfCalls: 5 # 최소 5번 이상 호출된 후 통계 계산 시작
failureRateThreshold: 50 # 실패율 50% 초과 시 회로 차단
waitDurationInOpenState: 20s # 오픈 상태 유지 시간 (이후 하프-오픈 전환)
permittedNumberOfCallsInHalfOpenState: 3 # 하프-오픈 시 허용할 테스트 호출 수
4. 폴백(Fallback) 메커니즘
- 4-1) Fallback 로직 구현
- 외부 호출 실패 시 사용자에게 보여줄 '플랜 B' 응답을 정의
@Service
public class OrderService {
// 서킷 브레이커 이름과 실패 시 호출될 메서드명을 매핑함
@CircuitBreaker(name = "productService", fallbackMethod = "productFallback")
public String getProductInfo() {
return externalApi.call(); // 외부 서비스 호출 로직
}
// 예외 발생 시 실행될 대체 메서드
public String productFallback(Throwable t) {
return "현재 상품 정보를 불러올 수 없어 기본 정보를 표시합니다.";
}
}
- 4-2) Fallback 도입 시 장점
- 장애 전파(Cascading Failure)를 차단하여 시스템의 일부분이 고장 나도 핵심 서비스는 유지됨
- 사용자에게 에러 페이지 대신 정제된 안내 메시지를 제공하여 서비스 신뢰도를 제고함
5. 모니터링 및 시각화 (Dashboard)
- 5-1) 메트릭 노출 설정
- Actuator와 Micrometer를 활용하여 서킷 브레이커의 상태 데이터를 외부로 내보냄
dependencies {
implementation 'io.github.resilience4j:resilience4j-micrometer'
implementation 'io.micrometer:micrometer-registry-prometheus'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
- 5-2) 대시보드 연동
- Prometheus가 수집한 데이터를 Grafana를 통해 실시간 차트로 시각화하여 모니터링 효율을 높임
6. Spring Cloud 에코시스템과의 연동
- 6-1) 통합 환경 구축
- Resilience4j는 Eureka, LoadBalancer와 결합하여 유기적으로 동작함
- 서비스 디스커버리를 통해 찾은 서버 리스트 중 장애가 반복되는 인스턴스를 서킷 브레이커가 차단하는 구조
spring:
cloud:
circuitbreaker:
resilience4j:
enabled: true # 스프링 클라우드 서킷 브레이커 연동 활성화