Circuit Breaker Pattern

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜μ—μ„œ ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€ μž₯μ• κ°€ μ—°μ‡„μ μœΌλ‘œ λ‹€λ₯Έ μ„œλΉ„μŠ€μ— μ „νŒŒλ˜μ–΄ 전체 μ‹œμŠ€ν…œμ˜ μž₯μ• λ‘œ μ΄μ–΄μ§€λŠ” 연쇄적 μ‹€νŒ¨λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ„œν‚· 브레이컀(Circuit Breaker) νŒ¨ν„΄μ„ μ‚¬μš©ν•œλ‹€.

핡심 원리 - μƒνƒœ λ¨Έμ‹ 

μ„œν‚· λΈŒλ ˆμ΄μ»€λŠ” λ‚΄λΆ€μ μœΌλ‘œ μ„Έ κ°€μ§€ μƒνƒœλ₯Ό κ°€μ§€λŠ” μœ ν•œ μƒνƒœ λ¨Έμ‹ (Finite State Machine)으둜 λ™μž‘ν•œλ‹€.

μƒνƒœ
μ„€λͺ…
μƒνƒœ 전이 쑰건

Closed(정상 μƒνƒœ)

λͺ¨λ“  μš”μ²­μ€ μ‹€μ œ μ„œλΉ„μŠ€λ₯Ό ν˜ΈμΆœν•˜λ©°, μ‹€νŒ¨λ₯Ό λͺ¨λ‹ˆν„°λ§

μ‹€νŒ¨μœ¨ λ˜λŠ” μ‹€νŒ¨ νšŸμˆ˜κ°€ μž„κ³„μΉ˜λ₯Ό μ΄ˆκ³Όν•˜λ©΄ Open μƒνƒœλ‘œ 전이

Open(회둜 차단 μƒνƒœ)

λͺ¨λ“  μš”μ²­μ„ μ¦‰μ‹œ μ‹€νŒ¨ 처리(Fail-fast)ν•˜λ©°, μ‹€μ œ μ„œλΉ„μŠ€λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμŒ

μ„€μ •λœ νƒ€μž„μ•„μ›ƒ μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ Half-Open μƒνƒœλ‘œ 전이

Half-Open(μ œν•œμ  ν…ŒμŠ€νŠΈ μƒνƒœ)

μ†Œμˆ˜μ˜ ν…ŒμŠ€νŠΈ μš”μ²­λ§Œ μ‹€μ œ μ„œλΉ„μŠ€λ‘œ 보내 응닡을 확인

ν…ŒμŠ€νŠΈ μš”μ²­μ΄ μ„±κ³΅ν•˜λ©΄ Closed둜, μ‹€νŒ¨ν•˜λ©΄ λ‹€μ‹œ Open μƒνƒœλ‘œ 전이

μ •λ°€ν•œ μž₯μ•  νŒλ‹¨ μ „λž΅

μ„œν‚· 브레이컀의 νš¨μœ¨μ„±μ€ 'μž₯μ• 'λ₯Ό μ–Όλ§ˆλ‚˜ μ •λ°€ν•˜κ²Œ μ •μ˜ν•˜λŠλƒμ— λ‹¬λ €μžˆλ‹€.

  • 였λ₯˜ μœ ν˜•μ˜ ꡬ뢄

    • 일반적으둜 λ„€νŠΈμ›Œν¬ νƒ€μž„μ•„μ›ƒ, 5xx μ„œλ²„ 였λ₯˜μ™€ 같은 μ‹œμŠ€ν…œ 였λ₯˜(System Errors)λ§Œμ„ μ„œν‚· 브레이컀의 μ‹€νŒ¨ νšŸμˆ˜μ— 포함

    • 4xx ν΄λΌμ΄μ–ΈνŠΈ 였λ₯˜λ‚˜ 같은 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 였λ₯˜λŠ” μ„œλΉ„μŠ€ 자체의 λΆˆμ•ˆμ •μ„±μ΄ μ•„λ‹ˆλ―€λ‘œ, μ„œν‚·μ„ μ—¬λŠ” μ‘°κ±΄μ—μ„œ μ œμ™Έν•˜λŠ” 것이 일반적

  • 볡합적인 μž„κ³„μΉ˜ μ„€μ •

    • 단일 μ§€ν‘œμ—λ§Œ μ˜μ‘΄ν•˜λ©΄ μ˜€μž‘λ™μ˜ 원인이 될 수 μžˆμ–΄, 볡수의 쑰건을 κ²°ν•©ν•˜μ—¬ μž₯μ•  νŒλ‹¨

    • μ΅œμ†Œ μš”μ²­ 횟수(Minimum Number of Calls): μ‹€νŒ¨μœ¨μ„ κ³„μ‚°ν•˜κΈ° 전에, λ¨Όμ € μΌμ •λŸ‰μ˜ μš”μ²­μ΄ λ°œμƒν•΄μ•Ό ν•œλ‹€λŠ” μ „μ œ 쑰건(예: 10초 λ™μ•ˆ μ΅œμ†Œ 20회 μš”μ²­)

    • 느린 호좜 λΉ„μœ¨(Slow Call Rate): λ‹¨μˆœ μ‹€νŒ¨λΏλ§Œ μ•„λ‹ˆλΌ, 응닡 μ‹œκ°„μ΄ μ§€λ‚˜μΉ˜κ²Œ κΈ΄ μš”μ²­ λ˜ν•œ μ„œλΉ„μŠ€ λΆˆμ•ˆμ •μ˜ μ „μ‘° μ¦μƒμœΌλ‘œ νŒλ‹¨(예: 1초 이상 μ†Œμš”λœ μš”μ²­μ˜ λΉ„μœ¨μ΄ n%λ₯Ό 초과)

λ‹€λ₯Έ 볡원성 νŒ¨ν„΄κ³Όμ˜ μƒν˜Έμž‘μš©

μ„œν‚· λΈŒλ ˆμ΄μ»€λŠ” λ‹¨λ…μœΌλ‘œ μ‚¬μš©λ˜κΈ°λ³΄λ‹€, λ‹€λ₯Έ νŒ¨ν„΄λ“€κ³Ό κ²°ν•©ν•˜μ—¬ 닀측적인 λ°©μ–΄ 체계λ₯Ό ꡬ좕할 λ•Œ 더 큰 효과λ₯Ό λ°œνœ˜ν•œλ‹€.

  • μž¬μ‹œλ„(Retry) νŒ¨ν„΄κ³Όμ˜ 관계

    • μž¬μ‹œλ„λŠ” μΌμ‹œμ μΈ λ„€νŠΈμ›Œν¬ λΆˆμ•ˆμ •κ³Ό 같은 μΌμ‹œμ  μž₯μ• (Transient Faults)에 효과적

    • μ„œν‚· λΈŒλ ˆμ΄μ»€λŠ” μ„œλΉ„μŠ€ λ‹€μš΄κ³Ό 같이 μ¦‰μ‹œ ν•΄κ²°λ˜κΈ° μ–΄λ €μš΄ 지속적인 μž₯μ• (Long-lasting Faults)에 λŒ€μ‘

    • 지속적인 μž₯μ•  μƒνƒœμ— λΉ μ§„ μ„œλΉ„μŠ€μ— λ¬΄λΆ„λ³„ν•œ μž¬μ‹œλ„λ₯Ό ν•˜λŠ” 것은 였히렀 μž₯μ•  μ„œλΉ„μŠ€μ˜ λΆ€ν•˜λ₯Ό κ°€μ€‘μ‹œν‚¬ 수 있음

  • 격벽(Bulkhead) νŒ¨ν„΄

    • 격벽 νŒ¨ν„΄μ€ μžμ›μ„ κ²©λ¦¬ν•˜μ—¬ ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€ λ¬Έμ œκ°€ 전체 μ‹œμŠ€ν…œμ˜ μžμ›μ„ κ³ κ°ˆμ‹œν‚€λŠ” 것을 λ°©μ§€

    • ν˜‘λ ₯적 λ°©μ–΄: 격벽 νŒ¨ν„΄μ€ μ—¬λŸ¬ λ‹€λ₯Έ μ™ΈλΆ€ μ„œλΉ„μŠ€λ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•œ μŠ€λ ˆλ“œ ν’€μ΄λ‚˜ 컀λ„₯μ…˜ ν’€ 같은 μžμ›μ„ 각각 격리

      • ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€μ— λŒ€ν•œ μ„œν‚· λΈŒλ ˆμ΄μ»€κ°€ 열리더라도, λ‹€λ₯Έ 정상 μ„œλΉ„μŠ€λ“€μ„ ν˜ΈμΆœν•˜λŠ” 데 ν•„μš”ν•œ μžμ›μ€ 영ν–₯을 λ°›μ§€ μ•ŠμŒ

Spring Framework 기반 κ΅¬ν˜„(Resilience4j)

Spring μƒνƒœκ³„μ—μ„œλŠ” Netflix Hystrixκ°€ μ΄ˆκΈ°μ— 널리 μ‚¬μš©λ˜μ—ˆμœΌλ‚˜, ν˜„μž¬λŠ” μœ μ§€λ³΄μˆ˜ λͺ¨λ“œλ‘œ μ „ν™˜λ˜μ—ˆμœΌλ©° Resilience4jκ°€ μ‚¬μ‹€μƒμ˜ ν‘œμ€€μœΌλ‘œ 자리 μž‘μ•˜λ‹€.

  • 핡심 λ™μž‘ 원리: AOP(관점 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°)

    • Resilience4jλŠ” Spring Boot와 κ²°ν•©ν•˜μ—¬ AOPλ₯Ό 기반으둜 λ™μž‘

    • κ°œλ°œμžκ°€ @CircuitBreaker μ–΄λ…Έν…Œμ΄μ…˜μ„ νŠΉμ • λ©”μ†Œλ“œμ— 뢙이면, μ„œν‚· 브레이컀 둜직(μƒνƒœ 확인, μ‹€νŒ¨ μΉ΄μš΄νŒ…, Fallback 호좜 λ“±)μ‹€ν–‰

κ΅¬ν˜„ μ˜ˆμ‹œ

μ•„λž˜ μ½”λ“œλŠ” externalApiServiceλΌλŠ” μ΄λ¦„μ˜ μ„œν‚· 브레이컀λ₯Ό callApi λ©”μ†Œλ“œμ— μ μš©ν•œ μ˜ˆμ‹œμ΄λ‹€.

λ§Œμ•½ μ„œν‚·μ΄ μ—΄λ¦¬κ±°λ‚˜ λ©”μ„œλ“œ μ‹€ν–‰ 쀑 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ fallback λ©”μ†Œλ“œκ°€ λŒ€μ‹  ν˜ΈμΆœλœλ‹€.

μ„€μ • μ˜ˆμ‹œ (application.yml)

μ„œν‚· 브레이컀의 ꡬ체적인 λ™μž‘ 방식은 application.yml νŒŒμΌμ„ 톡해 μ½”λ“œ λ³€κ²½ 없이 μœ μ—°ν•˜κ²Œ μ œμ–΄ν•  수 μžˆλ‹€.

λͺ¨λ‹ˆν„°λ§ 톡합

  • Spring Boot Actuator와 ν†΅ν•©ν•˜λ©΄ μ„œν‚· 브레이컀의 ν˜„μž¬ μƒνƒœ(CLOSED, OPEN λ“±)와 μ„€μ •κ°’, μ‹€νŒ¨μœ¨ 같은 상세 μ§€ν‘œλ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ 확인 κ°€λŠ₯

  • μ΄λŸ¬ν•œ μ§€ν‘œλŠ” Prometheus와 같은 λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œμœΌλ‘œ μˆ˜μ§‘λ˜μ–΄ Grafana λŒ€μ‹œλ³΄λ“œλ₯Ό 톡해 μ‹œκ°ν™”λ˜κ³ , μž₯μ•  λ°œμƒ μ‹œ μŠ¬λž™(Slack) λ“±μœΌλ‘œ μ•ŒλžŒμ„ λ³΄λ‚΄λŠ” 체계λ₯Ό κ΅¬μΆ•ν•˜λŠ” 데 ν™œμš©

Last updated

Was this helpful?