Spring Cloud Circuit Breaker - redutan/redutan.github.io GitHub Wiki

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