Resilience4j - Circuit Breaker (2). 설정
지난 포스트에서는 Resilience4j의 Circuit Breaker가 어떤 것인지, 그리고 어떻게 작동하는 지 알아보았습니다. 이번 포스트에서는 Resilience4j가 의도대로 작동할 수 있도록 설정하는 방법과 어떻게 인스턴스를 생성할 수 있는지 작성하려고 합니다.
Resilience4j 라이브러리 추가하기
Circuit Breaker를 관리 및 적용하기에 앞서, 다음 라이브러리들을 추가해야 합니다.
implementation 'io.github.resilience4j:resilience4j-spring-boot3'
// 필수
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-aop'
// webflux 사용하는 경우 필요
implementation 'io.github.resilience4j:resilience4j-reactor'
Circuit Breaker Configuration
서킷브레이커는 여러 설정값을 지정할 수 있도록 지원하고 있습니다. 아래 표는 서킷브레이커에서 지정할 수 있는 설정값이며, CircuitBreakerConfig를 통해 지정할 수 있습니다. 특정 설정값에 값을 지정하지 않는다면, 기본값으로 적용됩니다.
Config Property | Default Value | Description |
failureRateThreshold | 50 | 실패율 임계값(퍼센트). 실패율이 임계값보다 크거나 같다면, 서킷브레이커는 상태를 OPEN으로 변경하고 모든 호출을 차단합니다. |
slowCallRateThreshold | 100 | 느린호출 임계값(퍼센트). 서킷브레이커는 호출 시간이 slowCallDurationThreshold보다 길어진다면 느린 호출로 판단합니다. 그렇게 판단된 느린호출 비율이 임계값보다 크거나 같다면, 서킷브레이커는 상태를 OPEN으로 변경하고 모든 호출을 차단합니다. |
slowCallDurationThreshold | 60000(ms) | 호출시간 임계값. 해당 시간보다 호출 시간이 길어진다면, 서킷브레이커는 해당 호출을 느린 호출로 판단합니다. |
permittedNumberOfCallsInHalfOpenState | 10 | 서킷브레이커의 상태가 HALF_OPEN일 때, 허용되는 호출 수. |
maxWaitDurationInHalfOpenState | 0(ms) | 서킷브레이커가 HALF_OPEN 상태에서 가장 오래 대기하는 시간. 해당 시간 이후 OPEN으로 변경됩니다. 값이 0이라는 것은 서킷브레이커가 허용된 모든 호출이 완료될때까지 HALF_OPEN상태에서 대기하는 것을 의미합니다. |
sildingWindowType | COUNT_BASED | 슬라이딩 윈도우에서 서킷브레이커가 CLOSED인 경우 값을 집계할 때의 방식. 해당 값은 COUNT_BASED 또는 TIME_BASED가 되어야 합니다. |
sildingWindowSize | 100 | 슬라이딩 윈도우의 크기. 해당 값은 서킷브레이커가 CLOSED인 경우 값을 집계할 때 사용합니다. |
minimumNumberOfCalls | 100 | 서킷브레이커가 값을 집계하기 전, 최소 호출해야 하는 횟수. |
waitDurationInOpenState | 60000(ms) | 서킷브레이커가 상태를 OPEN에서 HALF_OPEN으로 변경시키기 전까지 대기하는 시간. |
automaticTransitionFromOpenToHalfOpenEnabled | false | OPEN에서 HALF_OPEN으로 넘어갈 때, 자동으로 넘어갈 지 여부. false라면, waitDurationInOpenState 시간이 지나가더라도 어떠한 호출이 일어나지 않으면 상태 변경이 일어나지 않습니다. |
recordExceptions | empty | 실패로 측정될 exception 리스트. 만약 어떤 exception들을 지정하게 된다면, 해당 excpetion들을 제외한 모든 exception들은 성공으로 측정됩니다. |
ignoreExceptions | empty | 실패와 성공 둘 다로 측정되지 않을 exception 리스트. 해당 exception과 일치하거나 상속하는 exception은 실패 또는 성공으로 측정되지 않습니다. |
recordFailurePredicate | throwable → true | 특정 exception이 실패로 측정되도록 하는 Custom Predicate. Predicate은 실패로 측정되고자 하는 exception은 true로, 성공으로 측정되고자 하는 경우는 false를 리턴해야 합니다. 기본값에서는 모든 exception이 실패로 기록됩니다. |
ignoreExcpetionPredicate | throwable → false | 특정 exception이 실패 또는 성공으로 측정되지 않도록 하는 Custom Predicate. Predicate은 무시해야 하는 exception은 true로, 실패로 측정되고자 하는 경우는 false를 리턴해야 합니다. 기본값에서는 어떤 exception도 무시되지 않습니다. |
Circuit Breaker 인스턴스 관리하기
Circuit Breaker 설정은 아래과 같은 2가지 방법으로 관리할 수 있습니다.
- yml 파일로 관리
- Spring Bean으로 관리
yml 파일로 Circuit Breaker 인스턴스 관리하기
yml파일에 설정하고자 하는 설정값을 추가하고, 인스턴스까지 미리 지정할 수 있습니다.
resilience4j.circuitbreaker:
configs:
default:
slidingWindowSize: 10
permittedNumberOfCallsInHalfOpenState: 10
waitDurationInOpenState: 10000
failureRateThreshold: 50
eventConsumerBufferSize: 10
registerHealthIndicator: true
instances:
testService:
baseConfig: default
minimum-number-of-calls: 1
waitDurationInOpenState: 5000
스프링 Bean 으로 Circuit Breaker 인스턴스 관리하기
yml뿐 아니라 Spring Bean으로 생성해서 관리할 수도 있습니다.
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import java.time.Duration;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@RequiredArgsConstructor
public class Resilience4jConfig {
private final CircuitBreakerRegistry circuitBreakerRegistry;
@Bean
public CircuitBreaker customCircuitBreaker() {
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofMillis(5000))
.permittedNumberOfCallsInHalfOpenState(2)
.slidingWindowSize(6)
.build();
return circuitBreakerRegistry.circuitBreaker("test", circuitBreakerConfig);
}
}
2023.02.11 - [Spring] - [Java/Spring] Resilience4j - Circuit Breaker (1). 정의
2023.02.11 - [Spring] - [Java/Spring] Resilience4j - Circuit Breaker (2). 설정 ✅
2023.02.13 - [Spring] - [Java/Spring] Resilience4j - Circuit Breaker (3). 적용
'Java, Kotlin, Spring' 카테고리의 다른 글
[Java/Stream] anyMatch, allMatch, noneMatch (1) | 2024.02.21 |
---|---|
[Java/Spring] Resilience4j - Circuit Breaker (3). 적용 (0) | 2023.02.13 |
[Java/Spring] Resilience4j - Circuit Breaker (1). 정의 (0) | 2023.02.11 |
[Java/Spring] (4) MapStruct - Mapper 세부 설정 (0) | 2023.01.13 |
[Java/Spring] (3) MapStruct - Mapping 필드 정의하기 2 (0) | 2023.01.13 |