프로젝트 서킷 브레이커 추가(resilience4j.circuitbreaker)

박상준·2024년 3월 10일
1

개인 프로젝트

목록 보기
1/2
post-custom-banner

라이브러리 추가

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

서킷브레이커 패턴 구성 정의

resilience4j.circuitbreaker:
  instances:
    parkingClientCircuitBreaker:
      registerHealthIndicator: true
      slidingWindowSize: 10
      minimumNumberOfCalls: 5
      permittedNumberOfCallsInHalfOpenState: 3
      automaticTransitionFromOpenToHalfOpenEnabled: true
      waitDurationInOpenState: 10s
      failureRateThreshold: 50
      eventConsumerBufferSize: 10
  • registerHealthIndicator
    • 서킷브레이커의 상태를 애플리케이션 건강 상태 지표에 등록할지 여부에 대한 속성이다.
    • 스프링 액츄에이터 사용시 /actuator/health 같은 엔트포인트로 어플리케이션의 건강 상태를 체크할 수 있다.
      • 예를 들어 서킷 브레이커의 상태가 OPEN 이라면
        외부 서비스 호출에 문제가 있음을 나타내는 것이다.
  • slidingWindowSize
    • 서킷 브레이커가 실패율을 계산하기 위해 고려하는 호출의 수를 말한다.

    • 이 값은 서킷 브레이커가 내부적으로 유지하는 링 버퍼의 크기를 결정한다.
      - 예를들어, 5으로 설정된 경우
      1. 성공
      2. 성공
      3. 실패
      4. 실패
      5. 성공

          이라면 총 5번중에 2번의 호출의 실패가 발생했기에, 실패율은 40% 가 된다.
          
      - 해당 임계값을 초과하면 서킷 브레이커는 `OPEN` 상태가 된다.
      💡 링버퍼

      서킷 브레이커가 내부적으로 사용하는 데이터 구조다.

    • 고정된 크기

    • 새로운 요소가 추가되는 경우 가장 오래된 요소를 덮어쓰는 방식으로 동작

  • minimumNumberOfCalls
    • 서킷 브레이커가 실패율을 계산하기 전에 최소한 수행되어야 하는 호출의 수
    • 이 값은 서킷 브레이커가 충분한 데이터를 수집할 때까지 기다려서 성공 실패에 대한 신뢰성을 증대시킨다.
  • permittedNumberOfCallsInHalfOpenState:
    • 서킷 브레이커가 반개방(Half-Open) 상태일 때 허용되는 호출 수입니다.
    • 이 값은 서킷 브레이커가 다시 닫히거나 열릴지 결정하기 전에 테스트로 수행할 호출의 수 정의함. 💡 서킷 브레이커의 3가지 상태 1. 닫힘 1. 모든 호출이 허용되는 상황 2. 일정 비율의 호출이 실패시 서킷 브레이커가 열린다. 2. 열림 1. 모든 호출이 차단 2. 외부 서비스에 문제가 있는 경우 발생 1. 일정 시간이 지난 후 반개방 상태로 전환된다. 3. 반개방 1. 제한된 수의 호출만 허용한다. 2. 외부 서비스 정상으로 돌아왔는지 테스트함
  • automaticTransitionFromOpenToHalfOpenEnabled
    • 서킷 브레이커가 자동으로 열린(Open) 상태에서 반개방(Half-Open) 상태로 전환할지 여부를 결정합니다.
    • true로 설정하면, 지정된 대기 시간이 지난 후 자동으로 전환됩니다.
  • waitDurationInOpenState
    • 서킷 브레이커가 열린 상태로 유지되는 시간입니다.
    • 이 시간이 지나면, 서킷 브레이커는 반개방 상태로 전환됩니다.
  • failureRateThreshold
    • 서킷 브레이커를 열기 위한 실패율의 임계값입니다.
      • 슬라이딩 윈도우 10 내의 50 임계값 설저시
        • 5개 초과의 실패의 경우 서킷 브레이커 OPEN
    • 이 값은 퍼센트(%)로 표시되며, 지정된 슬라이딩 윈도우 내에서 이 임계값을 초과하는 실패율이 발생하면 서킷 브레이커가 열립니다.
  • eventConsumerBufferSize
    • 서킷 브레이커 이벤트를 저장하기 위한 버퍼의 크기입니다.
    • 이 버퍼는 서킷 브레이커의 상태 변화나 호출 결과와 같은 이벤트를 저장하는 데 사용됩니다
      • 만약 10 으로 설정한 경우
      • 서킷 브레이커에서 발생하는 이벤트는 최대 10개까지 저장하는 메모리 공간을 의미한다.

Resilience4J 관련 yml 파일을 자바 파일로 설정한다면!

@Configuration
public class AddressApiOpenFeignConfig {
	
	@Bean
	public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
		return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
			.circuitBreakerConfig(CircuitBreakerConfig.custom()
				.slidingWindowSize(10)
				.minimumNumberOfCalls(5)
				.permittedNumberOfCallsInHalfOpenState(3)
				.automaticTransitionFromOpenToHalfOpenEnabled(true)
				.waitDurationInOpenState(Duration.ofSeconds(10))
				.failureRateThreshold(50)
				.recordException(e -> true)
				.build()
			)
			.timeLimiterConfig(
				TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()
			)
			.build());
	}
}
  • timeLimiterConfig 의 경우
    • 서킷 브레이커를 통해 실행되는 모든 호출은 최대 4초 동안만 실행될 수 있음을 알린다.
    • 그 이상이 걸리는 경우 자동으로 타임아웃을 발생하고 호출은 실패로 간주함.
      • 무한 대기상대에 빠지지 않도록 설정함

호출부

@FeignClient(name = "AddressApiOpenFeign", url = "${juso.url}", configuration = AddressApiOpenFeignConfig.class)
public interface AddressApiOpenFeign {

	@GetMapping
	AddressResponseDto getAddress(
		@RequestParam("confmKey") String confmKey,
		@RequestParam(value = "currentPage", defaultValue = "1") String currentPage,
		@RequestParam(value = "countPerPage", defaultValue = "10") String countPerPage,
		@RequestParam("keyword") String keyword,
		@RequestParam(value = "resultType", defaultValue = "json") String resultType
	);
}
  • configuration 을 추가한다.

호출 실패에 따른 레실리언스 반응성 테스트는 추후에 도전해보는 것으로..

profile
이전 블로그 : https://oth3410.tistory.com/
post-custom-banner

0개의 댓글