Skip to content

Spring Cloud Circuit Breaker

Jordan(정명주) edited this page Dec 23, 2023 · 6 revisions

Circuit Breaker(회로차단기)

  • Release It 에서 처음 소개된 패턴
  • 원격 서비스 호출 시 서비스 장애가 전파되는 것을 방지하는 패턴
  • Cloud, MSA 환경에서 필수 패턴 중 하나

circuit breaker

  • Close: 회로차단기가 닫혀 있으니까 통신이 잘되는 상태.
  • Open: 연결하는 서버의 통신이 계속 실패하니 아예 통신을 시도하지 않고 바로 실패(or Fallback)하는 상태. fail-fast
  • Half-Open: 통신이 가능한지 시도해 보는 상태. Open 상태에서 주기적으로 Half-Open 상태로 바뀜. 여기에서 통신이 성공 상태로 판단되면 Close 상태로 바뀜.

Spring Cloud Circuit Breaker

spring-cloud-circuitbreaker

현재는 resilience4j 구현체를 가장 많이 사용하고 있음

좋은 읽을거리

implementation("org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j")
  • spring boot Config 예시 (open-feign과 조합)
resilience4j:
  circuitbreaker: # https://resilience4j.readme.io/docs/circuitbreaker#create-and-configure-a-circuitbreaker
    configs:
      default:
        sliding-window-type: time_based # 시간 기반 윈도우 슬라이드 설정(default: count_based)
        sliding-window-size: 30 # 한 슬라이드 단위는 30초(default:100)
        minimum-number-of-calls: 10 # 최소 호출 개수. 이 이상 호출되어야지 오류 여부를 판단할 수 있다. (default: 100)
        slow-call-rate-threshold: 75 # slow-call 비율 임계치(%).(default: 100) slow-call이 이 임계치를 넘어가면 OPEN 된다.
        slow-call-duration-threshold: 6s # slow-call 로 판단하는 대기시간 임계치
        wait-duration-in-open-state: 15s # OPEN -> HALF_OPEN 으로 전환되기 전에 대기시간 (default: 60s)
        permitted-number-of-calls-in-half-open-state: # HALF_OPEN 시 허용되는 호출 수 (default: 10)
        ignore-exceptions: # 해당 예외는 장애로 판단하지 않음.(애플리케이션 내에서 400 계열로 발생할 수 있는 상황)
          - com.sample.exception.InternalApiClientException
      kakao:
        base-config: default
      naver:
        base-config: default
        slow-call-duration-threshold: 8s
    instances:
      default:
        base-config: default

  timelimiter:
    configs:
      default:
        timeout-duration: 9s # slowCallDurationThreshold보다는 크게 설정되어야 함. 그리고 feign read-timeout 보다 짧아야함
        cancel-running-future: true
      naver:
        base-config: default
        timeout-duration: 11s
      kakao:
        base-config: default
        timeout-duration: 11s

spring:
  cloud:
    circuitbreaker:
      resilience4j:
        disable-time-limiter: true  # spring-boot 3.1.x 에서 사용 예정
    openfeign:
      circuitbreaker:
        enabled: true
        group:
          enabled: true # 그룹 별로 관리.(모든 메서드에 대해서 관리힘들어서 개인적으로 선호함 특히 openfeign 통합 시)
      client:
        config:
          default:
            logger-level: basic
            connect-timeout: 2000
            read-timeout: 8000
          naver:
            url: ${application.naver-open-api.origin} # 따로 정의해 둠
          kakao:
            url: ${application.kakao-open-api.origin} # 따로 정의해 둠
            read-timeout: 10000
      compression:
        request:
          enabled: true
        response:
          enabled: true
      httpclient:
        hc5: # hc5가 좋은 것 같음. ok-http의 경우에는 네이티브 자원 사용하는지라 장애 요소가 있음.
          enabled: true
          pool-reuse-policy: fifo
          pool-concurrency-policy: strict
Clone this wiki locally