목차
- Circuit Breaker란?
- Circuit Breaker 패턴 동작 방식
2.1 Circuit Breaker 상태 종
2.2 Circuit Breaker의 장애 판단 기준
2.3 Circuit Breaker 동작 방식- Resilience4j 라이브러리
3.1 Resilience4j
3.2 핵심 모듈
3.3 기본 설정 및 예시
1. Circuit Breaker란?
Circuit Breaker란 사전적 의미로 회로 차단기이다. 회로 차단기는 전기 회로에서 과부하가 걸리거나 단락으로 인한 피해를 막기 위해 자동으로 회로를 정지시키는 장치이다. 차단기는 어느 정도 시간이 지난 뒤에는, 원래의 기능이 동작하도록 복귀한다.
Circuit Breaker 패턴은 회로 차단기처럼 MSA에서 장애 전파를 방지하기 위한 디자인 패턴이다. MSA 환경에서는 여러 서비스들이 의존 관계를 맺고 있다. 특정 서비스에 장애가 발생하면, 연쇄적으로 다른 서비스에 영향을 미칠 수 있다. Circuit Breaker는 이러한 연쇄 장애를 방지하고, 시스템 안정성을 높이는데 중요한 역할을 한다.
소프트웨어는 모두 실패한다.
아마존 부사장인 버너 보겔스의 말은 인상적이다. 시스템은 언제나 실패할 수 있다. 따라서 실패를 예방하고 대응하는 것이 중요하다. Circuit Breaker 패턴은 이러한 실패에 유연하고 빠르게 대응 할 수 있는 시스템을 만들 수 있도록 도와준다.
2. Circuit Breaker 패턴 동작 방식
2.1 Circuit Breaker 상태 종류
Circuit Breaker의 상태는 다음과 같이 크게 3가지가 있다.
- CLOSED (정상 상태)
- 회로가 닫힌 상태로 모든 요청이 정상적으로 처리되는 상태
- 실패율이 임계치보다 낮은 상황
- OPEN (차단 상태)
- 실패율이 임계치를 초과한 상태
- 시스템에 장애가 발생했다고 판단해 모든 요청을 즉시 차단
- 설정된 대기 시간 동안 유지 (OPEN 상태를 유지하도록 설정할 수도 있음)
- HALF-OPEN (반개방 상태)
- OPEN 상태에서 대기 시간이 지나면 전환된 상태로 서비스의 회복 여부를 확인하는 시험 상태
- 일부 요청들의 성공/실패에 따라 CLOSED 또는 OPEN으로 전환
2.2 Circuit Breaker의 장애 판단 기준
Circuit Breaker의 장애 판단 기준은 다음과 같이 크게 2가지가 있다.
- Slow call
- 설정된 임계값보다 응답시간이 초과한 경우를 의미한다.
- 성능 저하의 지표로 활용할 수 있으며 실패율 계산에 포함될 수 있다.
- Failure call
- 설정한 임계값보다 실패 횟수가 초과한 경우를 의미한다.
- 실패하거나 예외가 발생한 요청으로 HTTP 500 에러나 타임아웃 등이 해당한다.
- Circuit Breaker 상태 전환의 주요 기준이다.
위의 두 가지를 조합하여 상황에 맞게 장애를 감지하고 서킷 상태를 변경하는 조건을 설정할 수 있다.
2.3 Circuit Breaker 동작 방식
Circuit Breaker는 각 상태에 따라 다음과 같이 동작한다.
- CLOSED
- 초기 상태로 요청을 대상 서비스로 전달한다.
- Sliding Window를 통해 최근 요청들의 성공/실패를 모니터링한다.
- CLOSED → OPEN
- 장애 감지 및 임계값 초과시 (느린 호출율 또는 호출 실패율) OPEN으로 상태를 변경한다.
- OPEN 상태에서는 해당 요청이 차단되며, Fallback으로 응답을 처리할 수 있다.
- 이를 통해 장애가 발생한 서비스에 부하를 차단하고 빠른 실패 처리와 대응을 할 수 있다.
- OPEN → HALF-OPEN
- 회로가 OPEN되고 설정된 대기시간이 지난 후, HALF-OPEN으로 변경된다.
- 제한된 요청만을 실제 서비스로 전달해 서비스 회복 여부를 확인하기 위한 상태 변경이다.
- HALF-OPEN → CLOSED
- 일부 요청들이 다시 외부 서버에 전달되고, 서비스가 복구되어 성공할 경우 CLOSED로 변경한다.
추가로 장애 발생 상황과 상태 변경 감지 등에 대해 모니터링 시스템과 알림 설정을 구축하면 빠른 대응이 가능하다.
3. Resilience4j 라이브러리
3.1 Resilience4j
Resilience4j는 Java 애플리케이션의 fault tolerance(장애 허용)를 위한 경량 라이브러리이다. Netflix Hystrix에서 영감을 받아 제작되었으며, 함수형 프로그래밍 패러다임을 기반으로 설계되었다. Netflix가 만든 Hystrix는 지원을 중단해 Resilience4J를 사용하면 된다. 그리고 Resilience4j는 Spring Boot 2 와 Spring Boot 3에 따라 사용할 수 있는 버전이 다르니 필요에 맞게 사용하면 된다.
3.2 핵심 모듈
Resilience4j는 모듈화된 구조로 필요한 기능만 선택해 사용 가능하다. 제공하는 주요 모듈은 다음과 같다.
- resilience4j-circuitbreaker: 장애 감지 및 차단을 위한 Circuit Breaker 패턴 구현
- resilience4j-ratelimiter: 서비스 요청에 대한 속도 제한을 구현
- resilience4j-bulkhead: 동시 실행되는 요청 수를 제한하여 시스템 리소스를 보호 (동시성 제어)
- resilience4j-retry: 재시도 메커니즘
- resilience4j-timelimiter: 요청 처리 시간을 제한하여 타임아웃을 관리
- resilience4j-cache: 응답 결과 캐싱
3.3 기본 설정 및 예시
resilience4j에서 사용할 수 있는 슬라이딩 윈도우로 다음 2가지가 있다.
- 최근 N개 요청을 집계하는 횟수 기반 슬라이딩 윈도우(Count-based sliding window)
- 최근 N초 동안 보낸 요청을 집계하는 시간 기반 슬라이딩 윈도우(Time-based sliding window)
다음은 resilience4j의 설정 예시이다. circuit breaker를 사용하기 위해 어떤 설정이 있는지 간단하게 살펴보고 다음 글에서 코드와 함께 살펴보자.
resilience4j:
circuitbreaker:
configs:
default:
slidingWindowType: COUNT_BASED
slidingWindowSize: 3
automaticTransitionFromOpenToHalfOpenEnabled: true
waitDurationInOpenState: 30s
failureRateThreshold: 50
slowCallRateThreshold: 80
slowCallDurationThreshold: 5s
registerHealthIndicator: true
timelimiter:
configs:
default:
timeoutDuration: 6s
cancelRunningFuture: true
- slidingWindowType: 호출 결과를 기록할 슬라이딩 윈도우의 타입 설정
- COUNT_BASED: 횟수 기반 기록
- TIME_BASED: 시간 기반 기록
- slidingWindowSize: 슬라이딩 윈도우의 크기
- automaticTransitionFromOpenToHalfOpenEnabled: OPEN에서 HALF OPEN으로 자동 변환 여부 설정
- waitDurationInOpenState: OPEN을 유지할 시간 설정으로 이 시간을 유지 후 HALF_OPEN 상태로 변경
- failureRateThreshold: 예외가 발생한 호출의 임계 비율
- slowCallRateThreshold: 응답 시간이 느린 호출의 임계 비율
- slowCallDurationThreshold: 느린 호출율로 간주하기 위한 시간 설정으로 TimeLimiter의 timeoutDuration보다 작아야 함
- registerHealthIndicator: Spring Actuator와 연동하여 Circuit Breaker 상태 모니터링 여부 설정
- timeoutDuration: 요청이 완료되어야 하는 최대 시간
- 설정한 시간이 지나도 응답이 오지 않으면 타임아웃 예외 발생
- Circuit Breaker가 느린 호출을 감지하기 전에 TimeLimiter가 요청을 종료시키면 안 되기 때문에 slowCallDurationThreshold 보다 크게 설정해야함
- cancelRunningFuture
- 타임아웃 발생 시 실행 중인 작업을 취소할지 여부
다음 글에서 Spring Boot 프로젝트에 Resilience4j의 적용 방법을 코드와 함께 자세히 살펴보자.
관련글
- [Spring] Resilience4j를 통한 Circuit Breaker 패턴 적용 - (1)개념
- [Spring] Resilience4j를 통한 Circuit Breaker 패턴 적용 - (2)적용
✅ 관련 자료
✅ 참고 사례
'Spring Boot' 카테고리의 다른 글
[Spring] SOLID 원칙 (1) | 2025.02.06 |
---|---|
[Spring] Resilience4j를 통한 Circuit Breaker 패턴 적용 - (2)적용 (0) | 2025.01.15 |
[Spring] Redis를 이용한 대기열 관리 (0) | 2024.12.28 |
[Spring] Transaction 분리를 통한 성능 개선 (0) | 2024.12.27 |
[Spring] Lock을 이용한 동시성 제어 - 낙관적락/비관적락/분산락 (2)적용 (0) | 2024.12.27 |