본문 바로가기
MSA

5 - 서킷브레이커

by 젼젼39 2026. 2. 23.

1. 서킷 브레이커 개요

  • 1-1) 서킷 브레이커의 정의와 역할
    • 마이크로서비스 간의 통신 장애를 감지하여 전체 시스템의 붕괴를 막는 장애 차단기 역할을 수행
    • 외부 서비스가 응답하지 않거나 오류를 발생시킬 때, 무작정 기다리는 대신 빠른 실패(Fail-fast)를 유도하여 시스템의 복원력을 높임
    • 주요 메커니즘: 상태 감지(Monitoring) → 회로 차단(Isolation) → 복구 시도(Recovery)

2. Resilience4j 상세 가이드

  • 2-1) Resilience4j란?
    • 넷플릭스 Hystrix의 중단 이후 스프링 생태계의 표준이 된 서킷 브레이커 라이브러리
    • 경량화된 구조를 지향하며, 서비스 간 호출 실패를 제어하여 시스템의 연속성을 보장함
  • 2-2) 서킷 브레이커의 3가지 상태 변화
    1. 클로즈드(Closed): 회로가 닫힌 정상 상태임. 모든 요청이 통과되며, 내부적으로 실패율을 모니터링함
      • 예: 실패율 임계값이 50%일 때, 5번 중 3번 실패하면 오픈 상태로 즉시 전환됨
    2. 오픈(Open): 장애 발생 시 회로를 열어 모든 요청을 즉시 차단함
      • 서버 부하를 줄이기 위해 에러 응답(Fallback)을 즉시 반환하며, 설정된 대기 시간만큼 유지됨
    3. 하프-오픈(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 # 스프링 클라우드 서킷 브레이커 연동 활성화

'MSA' 카테고리의 다른 글

7 - 보안 구성  (0) 2026.02.23
6 - API 게이트웨이  (0) 2026.02.23
4 - 로드밸런싱  (0) 2026.02.23
3 - 서비스 디스커버리 (Eureka)  (0) 2026.02.23
2 - Spring Cloud  (0) 2026.02.23