본문 바로가기
Java, Kotlin, Spring

[Java/Spring] Resilience4j - Circuit Breaker (2). 설정

by 댕댕미냉 2023. 2. 11.

Resilience4j

 

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). 적용