마이크로서비스 환경에서는 서비스 간 호출이 빈번하게 발생합니다. 이때 한 서비스의 장애가 다른 서비스로 전파되면, 전체 시스템이 연쇄적으로 다운되는 장애 전이(Failure Cascade)가 발생할 수 있습니다. 이를 방지하기 위해 사용하는 기술이 바로 Circuit Breaker (서킷 브레이커) 패턴이며, Spring Cloud에서는 Hystrix 또는 Resilience4j로 구현할 수 있습니다.
서킷 브레이커(Circuit Breaker)란?
서킷 브레이커는 마이크로서비스 간 호출 시 장애가 지속될 경우, 일정 시간 동안 호출을 차단하여 장애 전파를 방지하는 패턴입니다.
[정상 상태] → [Open 상태] → [Half-Open 상태] → [Closed 상태]
- Closed: 모든 요청 정상 처리
- Open: 일정 실패율 초과 시 호출 차단
- Half-Open: 일정 시간 후 일부 요청 테스트 → 성공 시 Closed로 복귀
이 구조를 통해 장애 서비스로의 불필요한 호출을 줄이고, 시스템 전체의 안정성을 높일 수 있습니다.
Hystrix vs Resilience4j
Spring Cloud 초창기에는 Netflix Hystrix가 표준으로 사용되었으나, 현재는 Resilience4j가 권장됩니다.
| 비교 항목 | Hystrix | Resilience4j |
|---|---|---|
| 지원 상태 | Netflix에서 지원 종료 | 현재 Spring 공식 권장 |
| 구현 방식 | Thread/Signal 기반 (Heavy) | Functional Interface 기반 (Lightweight) |
| 성능 | 상대적으로 높은 오버헤드 | 비동기·반응형 환경에 적합 |
| 통합성 | Spring Cloud Netflix | Spring Boot 2.x/3.x 완전 호환 |
따라서, 신규 프로젝트나 Spring Boot 2.x 이상 환경에서는 Resilience4j 사용을 권장합니다.
Resilience4j 핵심 구성
Resilience4j는 여러 내결함성 패턴(Fault Tolerance Patterns)을 제공합니다.
- CircuitBreaker: 장애 시 호출 차단
- Retry: 일시적 실패 시 자동 재시도
- RateLimiter: 초당 요청 수 제한
- Bulkhead: 리소스 격리 (스레드 풀 또는 동시 호출 제한)
- TimeLimiter: 호출 시간 제한
이 기능들을 조합하면 마이크로서비스의 회복탄력성을 크게 향상시킬 수 있습니다.
Resilience4j 기본 설정
1. 의존성 추가 (Gradle)
implementation 'io.github.resilience4j:resilience4j-spring-boot3'
implementation 'org.springframework.boot:spring-boot-starter-aop'
2. application.yml 설정
resilience4j:
circuitbreaker:
instances:
userService:
registerHealthIndicator: true
failureRateThreshold: 50
slowCallRateThreshold: 50
slowCallDurationThreshold: 2s
waitDurationInOpenState: 5s
permittedNumberOfCallsInHalfOpenState: 3
slidingWindowType: COUNT_BASED
slidingWindowSize: 10
retry:
instances:
userService:
maxAttempts: 3
waitDuration: 500ms
위 설정은 userService 호출의 실패율이 50% 이상이면 5초간 회로를 열고, 3회 재시도를 수행하도록 구성한 예시입니다.
Resilience4j 적용 예제
@RestController
@RequiredArgsConstructor
public class UserController {
private final RestTemplate restTemplate;
@GetMapping("/users")
@CircuitBreaker(name = "userService", fallbackMethod = "fallbackUserService")
@Retry(name = "userService")
public String getUserInfo() {
return restTemplate.getForObject("http://USER-SERVICE/info", String.class);
}
public String fallbackUserService(Exception ex) {
return "User Service is temporarily unavailable. Please try again later.";
}
}
@CircuitBreaker 애노테이션은 지정된 인스턴스 설정을 적용하고, 장애 발생 시 fallbackMethod로 대체 응답을 반환합니다. @Retry는 일시적 장애(예: 네트워크 타임아웃)에 대해 자동 재시도를 수행합니다.
Hystrix 사용 예시 (참고)
Hystrix는 더 이상 권장되지 않지만, 기존 프로젝트에서는 여전히 사용 중일 수 있습니다.
@RestController
public class ProductController {
@HystrixCommand(fallbackMethod = "fallbackProduct")
@GetMapping("/products")
public String getProducts() {
// 외부 API 호출
throw new RuntimeException("Product API Down");
}
public String fallbackProduct() {
return "Fallback Product List";
}
}
Hystrix는 @HystrixCommand를 사용하며, fallback 메서드를 통해 장애 시 대체 응답을 반환합니다. 단, 최신 Spring Boot 버전에서는 Resilience4j로 마이그레이션하는 것을 추천합니다.
Actuator와 통합 모니터링
Resilience4j는 Spring Boot Actuator와 통합되어 서킷 브레이커 상태를 모니터링할 수 있습니다.
GET /actuator/health
GET /actuator/circuitbreakers
GET /actuator/metrics/resilience4j.circuitbreaker.calls
Grafana, Prometheus와 연동하면 장애율, 호출 횟수, 오픈 상태 비율 등의 지표를 시각화할 수 있습니다.
실무에서의 활용 전략
- Fallback 응답 설계: 사용자에게 단순 오류가 아닌 캐시 데이터 또는 기본값 제공
- Bulkhead 패턴 적용: 서비스별 스레드풀 분리로 장애 격리
- Retry 제한: 무한 재시도는 피하고, 백오프(Backoff) 전략 적용
- 로그/모니터링 연계: 장애 발생 시 Sleuth + Zipkin으로 추적
- 테스트 자동화: Chaos Monkey 등 장애 주입 테스트 도구로 검증
주의할 점
- 서킷 브레이커 설정이 과도하면 정상 요청도 차단될 수 있음
- Fallback 로직은 반드시 빠르게 실행되어야 함
- 모든 호출에 서킷 브레이커를 적용하면 오히려 복잡도 증가
- Resilience4j 설정값은 서비스 성격에 따라 세밀하게 조정 필요
Hystrix와 Resilience4j는 마이크로서비스 장애 대응의 핵심 기술입니다. 특히 Resilience4j는 경량, 확장성, Spring Boot 3.x 완전 호환성 덕분에 최신 MSA 환경에 적합합니다. 서킷 브레이커, 재시도, 속도 제한을 올바르게 조합하면 시스템 전체의 회복탄력성(Resilience)을 크게 향상시킬 수 있습니다.
'개발 > JAVA' 카테고리의 다른 글
| Spring Boot + Docker로 배포하기 - 손쉬운 컨테이너 기반 애플리케이션 배포 (0) | 2025.11.09 |
|---|---|
| Sleuth와 Zipkin으로 분산 트레이싱 - 마이크로서비스의 요청 흐름 가시화 (0) | 2025.11.08 |
| Eureka로 서비스 디스커버리 구현하기 - 마이크로서비스의 핵심 인프라 구성 (0) | 2025.11.06 |
| Spring Cloud Gateway로 API 게이트웨이 만들기 - 마이크로서비스 통합의 핵심 구성 (0) | 2025.11.05 |
| [JAVA] Spring Cloud Config 서버 구축하기 — 마이크로서비스 환경에서의 중앙 설정 관리 (0) | 2025.11.04 |
