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)μν· λΈλ μ΄μ»€μ ꡬ체μ μΈ λμ λ°©μμ application.yml νμΌμ ν΅ν΄ μ½λ λ³κ²½ μμ΄ μ μ°νκ² μ μ΄ν μ μλ€.
λͺ¨λν°λ§ ν΅ν©
Spring Boot Actuatorμ ν΅ν©νλ©΄ μν· λΈλ μ΄μ»€μ νμ¬ μν(CLOSED, OPEN λ±)μ μ€μ κ°, μ€ν¨μ¨ κ°μ μμΈ μ§νλ₯Ό μ€μκ°μΌλ‘ νμΈ κ°λ₯
μ΄λ¬ν μ§νλ Prometheusμ κ°μ λͺ¨λν°λ§ μμ€ν μΌλ‘ μμ§λμ΄ Grafana λμ보λλ₯Ό ν΅ν΄ μκ°νλκ³ , μ₯μ λ°μ μ μ¬λ(Slack) λ±μΌλ‘ μλμ 보λ΄λ 체κ³λ₯Ό ꡬμΆνλ λ° νμ©
Last updated
Was this helpful?