피드로 돌아가기
Circuitbreaker를 사용한 장애 전파 방지
올리브영 테크블로그올리브영 테크블로그
Backend

Circuitbreaker를 사용한 장애 전파 방지

올리브영 인벤토리 스쿼드가 Resilience4j의 CircuitBreaker를 도입해 MSA 환경에서 서비스 간 장애 전파 차단

2023년 8월 31일12intermediate

Context

MSA 구조로 전환하면서 서비스 간 호출 관계가 복잡해지고, 한 서비스의 장애가 다른 서비스로 연쇄적으로 전파되는 문제가 발생했다. 특히 재고 API에서 외부 서비스 호출 실패 시 요청이 계속 시도되어 시스템 전체에 부하를 주고 있었다.

Technical Solution

  • CircuitBreaker를 Closed(정상) → Open(장애) → Half-Open(복구 판단) 상태 머신으로 구현해 장애 감지 및 요청 차단
  • 실패 비율 임계치(failureRateThreshold, 기본값 50%)와 느린 응답 임계치(slowCallDurationThreshold, 기본값 60000ms)로 두 가지 장애 판정 기준 설정
  • 슬라이딩 윈도우 기반 메트릭 수집으로 최근 100개 호출(기본값)의 성공/실패 상태를 추적
  • Netflix Hystrix 대신 경량 라이브러리인 Resilience4j를 선택해 CircuitBreaker, Retry, RateLimiter, TimeLimiter, Bulkhead, Cache 6개 모듈 제공
  • Retry(Order -4) > CircuitBreaker(Order -3) > RateLimiter > TimeLimiter > Bulkhead 우선순위로 AOP 기반 적용해 장애 처리 계층화
  • Spring Actuator와 Datadog의 resilience4j.circuitbreakers.state 메트릭으로 각 CircuitBreaker의 상태, 실패율, 느린 호출 비율 모니터링
  • Redis에서 조회 실패 시 RDB로 폴백하는 fallback 메커니즘 구현해 가용성 확보

Key Takeaway

MSA 환경에서는 서비스 간 동기 호출의 장애를 격리(isolation)하기 위해 CircuitBreaker 패턴이 필수이며, Resilience4j는 Netflix Hystrix의 deprecated 이후 표준 선택지로 상태 관리와 모니터링이 명확한 경량 솔루션이다.


Kotlin/Java 기반 MSA 백엔드 서비스에서 외부 API나 데이터베이스 호출 시 Resilience4j CircuitBreaker를 @CircuitBreaker 어노테이션으로 감싸면, 호출 실패가 50% 이상일 경우 자동으로 요청을 차단해 불필요한 대기 시간과 연쇄 장애를 방지할 수 있다. Spring Actuator 설정으로 /api/actuator/health 엔드포인트에서 각 CircuitBreaker의 상태(failureRate, bufferedCalls, state 등)를 실시간 확인 가능하다.

원문 읽기