MSA

[MSA] Spring Boot - CricuitBreaker란? Resilience4J example

차노도리 2023. 5. 13. 00:05

CircuitBreak

  • 장애가 발생하는 서비스에 반복적인 호출이 되지 못하게 차단
  • 다른 서비스로 대체 수행

 

의존성 주입 (build.gradle)

dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'
	...
}

 

CircuitBreaker 설정 파일 (Default 설정 있어서 Custom 하게 사용할 경우만 생성)

  • CircuitBreakerConfig
    • failureRateThreshold
      • CirucitBreaker open 결정 횟수
      • default : 50
    • waitDurationInOpenState
      • CircuitBreak를 open 한 상태 유지하는 지속시간, 이후에는 half-open
      • default 60
    • slidingWindowType
      • CircuitBreak가 닫힐때 통화 결과를 기록하는 데 사용되는 슬라이딩 창의 유형 구성, (카운트기만, 시간기반)
    • slidingWindowSize
      • CircuitBreak가 닫힐 때 호출 결과를 기록하는데 사용되는 슬라이딩 창의 크기
      • default 100
  • TimeLimiterConfig
    • timeoutDuration
      • 문제라고 감지하는 시간 설정
import ...

@Configuration
public class Resilience4JConfig {

    @Bean
    public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration(){

        CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
                .failureRateThreshold(4)
                .waitDurationInOpenState(Duration.ofMillis(3000))
                .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
                .slidingWindowSize(2)
                .build();

        TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
                .timeoutDuration(Duration.ofSeconds(4))
                .build();
                

        return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
                .timeLimiterConfig(timeLimiterConfig)
                .circuitBreakerConfig(circuitBreakerConfig)
                .build());
    }
}

 

CircuitBreaker 사용 예시

  • CircuitBreakerFactory를 주입 받는다.
  • CircuitBreaker 객체를 만든다.
  • CircuitBreaker을 사용한다.
import ...

@Service
@Slf4j
public class UserServicesImpl implements UserService {

	...
    CircuitBreakerFactory circuitBreakerFactory;

    @Autowired
    public UserServicesImpl(...,CircuitBreakerFactory circuitBreakerFactory) {
	...
        this.circuitBreakerFactory = circuitBreakerFactory;
    }


    @Override
    public UserDto getUserByUserId(String userId, HttpHeaders headers) {

        ...
        CircuitBreaker circuitBreaker = circuitBreakerFactory.create("vocaServerCircuitbreaker");
        StarsResponse stars = circuitBreaker.run(() -> vocaServerClient.getStarsByUser(userId, headers), 
        				throwable -> new StarsResponse(new ArrayList<StarResponse>()));
        
        ...
    }
}