(MSA - Spring) Resilience4j - CircuitBreaker

salgu·2022년 7월 23일
0

Spring Cloud

목록 보기
6/9

CircuitBreaker란

  • 장애가 발생하는 서비스에 반복적인 호출이 되지 못하게 차단해주고
    정상적으로 동작하지 않을 경우 다른 기능으로 대체 수행합니다.(장애 회피)
  • Micro service 통신시 연쇄 오류를 막아줍니다.

일반적으로 마이크로 서비스간 통신에 문제가 생겨 circuitBreaker가 작동하면 열렸다고 표현하고
작동하지 않는 상태라면 닫혔다고 표현합니다.

custom curcuitBreaker config

@Configuration
public class Resilience4JConfiguration {

    @Bean
    public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
        CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
                .failureRateThreshold(4)
                .waitDurationInOpenState(Duration.ofMillis(1000))
                .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
                .slidingWindowSize(2)
                .build();

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

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

CircuitBreakerConfig

  • failureRateThreshold
    • circuitBreaker를 열지 닫을지 결정하는 failure rate
    • default : 50
  • waitDurationInOpenState
    • circuitBreaker를 open한 상태를 유지하는 지속 시간을 의미
    • 지속 시간 이후에는 half-open 상태
    • default : 60 sec
  • slidingWindowType
    • circuitBreaker가 닫힐때 통화 결과를 기록하는 데 사용되는 슬라이딩 창의 유형을 구성
    • COUNT_BASED, TIMED_BASED
  • slidingWindowSize
    • circuitBreaker가 닫힐 때 호출 결과를 기록하는데 사용되는 슬라이딩 창의 크기를 구성
    • default : 100
  • ignoreExceptions
    • 오류를 간주하지 않을 예외를 지정

TimeLimiterConfig

  • timeoutDuration
    • future supplier의 time limit을 정하는 API
    • default : 1 sec
    • 1초 동안 응답이 오지 않는다면 circuitBreaker가 열립니다.




다수개의 circuitBreaker 설정을 만들고 싶다면

return fatory -> fatory.configureDefault(
                id -> new Resilience4JConfigBuilder(id)
                .timeLimiterConfig(timeLimiterConfig)
                .circuitBreakerConfig(circuitBreakerConfig)
                .build(),
                "circuitBreaker name"
        );

Resilience4JConfigBuilder 생성자에 circuitBreaker name을 인자값으로 줄 수 있고

CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitBreaker name");

circuitBreaker를 생성할때 인자값으로 줬던 이름으로 config를 불러올 수 있습니다.



circuitBreaker 사용

/* CircuitBreaker */
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitBreaker name");

List<OrderRes> orders = circuitBreaker.run(
        () -> orderServiceClient.getOrders(userId), // toRun
        throwable -> new ArrayList<>() // fallback
);

CircuitBreaker.run 의 첫번째 파라미터로 요청을 할 수 있고
두번째 파라미터에 throwable이 넘어오면 유의미한 후 처리를 할 수 있습니다.




Study TODO : https://happycloud-lee.tistory.com/219

refer :
Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - 이도원님,
https://cheese10yun.github.io/resilience4j-basic/,
https://junhyunny.github.io/spring-boot/spring-cloud/msa/design-pattern/msa-circuit-breaker-pattern/

profile
https://github.com/leeeesanggyu, leeeesanggyu@gmail.com

0개의 댓글