π λ€μ΄κ°λ©°
μννΈμ¨μ΄λ λͺ¨λ μ€ν¨νλ€ - λ²λ 보κ²μ€(μλ§μ‘΄ λΆμ¬μ₯)
μ무리 μ΄μ¬ν μ€κ³νμ¬ κ°λ°νκ³ QAλ₯Ό μ§ννλ€ νλλΌλ
λκ³ κ° μμ€ν μ κ²½μ° νΉμ λκ³ κ°μ΄ μλλλΌλ μμμΉ λͺ»ν μ₯μ λ₯Ό λ§μ£Όνλ κ²½μ°κ° λ°μν©λλ€.
μ¬λ¬ κ°μ μμ λ 립μ μΈ λ§μ΄ν¬λ‘μλΉμ€λ‘ λΆν νλ μν€ν μ² ν¨ν΄μ΄ λ§μμ§λ μμ¦, λ¨μΌ μλΈ λλ©μΈμ μ₯μ κ°
μ 체 μμ€ν μ μν₯μ μ€ μ μμ΄ μμμΉ λͺ»ν μ₯μ μν©μ΄ λ°μν μ μμ΅λλ€.
μ΄λ κ²λ§ 보면 MSA μν€ν μ²λ‘ μ€κ³νλ κ² μμ²΄κ° μλͺ»λ κ²μ μλκΉ νλ μκ°μ΄ λ€ μ μμ΅λλ€.
νμ§λ§ μ΄λ 'μλ²½ν μμ€ν μ λ§λ€κΈ°λ³΄λ€, μ€ν¨μ μ μ°νκ³ λΉ λ₯΄κ² λμ κ°λ₯ν μμ€ν μ μ€κ³ν΄μΌ νλ€.' λΌλ μλ―Έλ‘ ν΄μν μλ μμ΅λλ€.
λ°λΌμ MSA νκ²½μμλ λ¨μΌ μλΈ λλ©μΈ(λ§μ΄ν¬λ‘μλΉμ€)μ μ₯μ κ° μ 체μμ€ν μ μν₯μ λ―ΈμΉμ§ μλλ‘
μ₯μ κ° λ°μν΄λ 견λ μ μλ λ΄κ²°ν¨μ±(Fault Tolerance) μ λν μ€κ³κ° 무μλ³΄λ€ μ€μν©λλ€.
μ΄λ₯Ό μν΄μ λ€μν κΈ°μ κ³Ό λ°©λ²λ€μ΄ μ‘΄μ¬νλ©°, μ΄λ² ν¬μ€ν μμλ κ·Έ μ€μμλ circuit-breaker-pattern μ λν΄ μμλ³΄κ³ μ ν©λλ€.
π μΌμ€μΌμ΄λ μ₯μ (Cascading_failure)
μΌμ€μΌμ΄λ μ₯μ λ MSA νκ²½μμ μλΉμ€μ μ¬μ©λμ΄ λ§μ κ²½μ°μ
ν μλΈ λλ©μΈμΌλ‘ κ³ΌλΆνκ° κ±Έλ¦¬κ±°λ λ€λ₯Έ μ¬μ λ‘ μΈν΄ μ€λ₯κ° λ°μνλ©΄ μ°μμ μΌλ‘ μ€λ₯κ° λ°μνλ κ²μ μλ―Έν©λλ€.
μλ₯Ό λ€μ΄ 'μ₯λ°κ΅¬λ λλ©μΈ'μμ μ₯λ°κ΅¬λμ λ΄κΈ΄ νλͺ©μ κ³μ°νλ κΈ°λ₯μ΄ λμλ λλ₯Ό λ€ μ μμ΅λλ€.
μ₯λ°κ΅¬λμ λ΄κΈ΄ ν΄λΉ νλͺ©μ μ¬κ³ λ₯Ό νμΈνκΈ° μνμ¬ 'μ 무 μ§μ' λλ©μΈμ μ¬κ³ μνλ₯Ό λ¬Όμ΄λ³΄κ±°λ
μΏ ν°ν μΈμ μ μ©νκΈ° μν΄ 'μΏ ν° λλ©μΈ' μ μΏ ν°μ μ ν¨μ±μ λ¬Όμ΄λ³΄κΈ° μν΄ μΈλΆν΅μ μ νλ μν©μμ λ§μ½ λ λλ©μΈ μ€ ν λλ©μΈ μ΄λΌλμ₯μ κ° λ°μνμ¬ ReadTimeout λλ ConnectionTimeout μ΄ λ°μν κ²½μ° μ΄λ μ₯λ°κ΅¬λ λλ©μΈμ νλͺ©κ³μ° κΈ°λ₯μ΄ μ μμ μΌλ‘μλνμ§ μλ μν©μΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
μ΄λ¬ν κ²°ν¨λ€μ΄ λ°μνλ κ²½μ° λ§μ΄λν λ²κ·Έμ κ²½μ° μ§§μ μκ° νμ μ체μ μμ μ΄λ, μ¬μλ(Retry) ν¨ν΄κ½
κ°μ μ λ΅μΌλ‘ ν΄κ²°ν μ μμ΅λλ€.
κ·Έλ¬λ μκΈ°μΉ μμ μ΄λ²€νΈλ‘ μΈν μ€λ₯κ° λ°μνμ¬ μ μ 볡ꡬ μμ κΉμ§ μ€λ 걸리λ μν©μ΄ λ°μνκ² λλ©΄
μ΄λ¬ν μ€λ₯λ μ 체 μλΉμ€μ μ€ν¨μ μ΄λ₯Ό μ μμ΅λλ€. μ΄λ° μν©μμ μ¬μλ(Retry)λ₯Ό νμ¬
ν μλΈ λλ©μΈμ κ³μ νΈμΆνλ κ²μ 무μλ―Έ ν μ μμΌλ©° (μ€νλ € ν΄λΉ μλΈλλ©μΈμ μλ―Έμλ λΆνλ₯Ό κ³μ κ°ν μ μλ€)
μ€ν¨λ₯Ό λ°μλ€μ΄κ³ ν΄λΉ μ€ν¨λ₯Ό μ²λ¦¬ν΄μΌ ν©λλ€.
μλ₯Ό λ€μ΄, μλΉμ€λ₯Ό νΈμΆνλ μμ μ μ ν μκ°μ κ±Έμ΄λκ³ , ν΄λΉ κΈ°κ°λ΄μ μλ΅νμ§ μμ κ²½μ° μ€ν¨ λ©μμ§λ‘ μλ΅νλλ‘ κ΅¬νμ΄ κ°λ₯νν©λλ€. κ·Έλ¬λ ν΄λΉ μ λ΅μ μ ν μκ°μ΄ λ§λ£λ λκΉμ§ λμΌν μμ μ λν λ§μ λμμμ²μ μ°¨λ¨μν¬ μ μλ€. ν΄λΉ μμ²λ€μ μ°λ λμ λ©λͺ¨λ¦¬ λ° CPUλ±μ μμμ μ μ νκ² λ©λλ€.
κ²°κ³Όμ μΌλ‘ μ΄λ¬ν 리μμ€κ° κ³ κ°λμ΄ λμΌν 리μμ€λ₯Ό μ¬μ©ν΄μΌ νλ μμ€ν μ κ΄λ ¨λμ§ μμ λ€λ₯Έ λΆλΆκΉμ§ μ€λ₯κ° λ°μν μ μμ΅λλ€. μ΄λ¬ν μν©μμ μμ μ΄ μ¦μ μ€ν¨νκ³ μ±κ³΅ν κ°λ₯μ±μ΄ μλ κ²½μ°μλ§ μλΉμ€ νΈμΆμ νλ κ²μ΄ μ’μ΅λλ€.
μν·λΈλ μ΄μ»€ ν¨ν΄(circuit-breaker-pattern)μ μ₯μ κ° λ°μν μλΉμ€λ₯Ό κ°μ§νκ³
λμ΄μ μμ²μ 보λ΄μ§ μλλ‘ μ°¨λ¨νμ¬, μ₯μ κ° νΌμ§μ§ μλλ‘ κ²©λ¦¬μν΅λλ€.
π μν·λΈλ μ΄μ»€ (Circuit-breaker)
CircuitBreakerλ μ§μνλ©΄ νλ‘ μ°¨λ¨κΈ°λ‘,
κ°μ μ§μμ μ½κ² λ³Ό μ μλ λμ μ°¨λ¨κΈ°κ° νμ¬λ₯Ό λ§λ κ²κ³Ό λΉμ·νκ² μΉ μ ν리μΌμ΄μ
μ΄ μ€ν¨νκ³ μλ μμ² νΉμ μ€ν¨ν κ°λ₯μ±μ΄ μλ μμ
μ λ°λ³΅μ μΌλ‘ μ€ννλ €κ³ μλνλ κ²μ λ°©μ§νμ¬ μλΉμ€ κ°μ μ₯μ μ νλ₯Ό λ§λ μν μ νλ€κ³ μ΄ν΄νλ©΄ λ©λλ€.
μ΄λ₯Ό ν΅ν΄ μμ€ν μ μ₯μ νμ°μ λ§κ³ μ₯μ 볡ꡬλ₯Ό λμμ£Όλ©° μ μ λ λΆνμνκ² λκΈ°νμ§ μκ² λ©λλ€.
λν μ€λ₯κ° μ€λ μ§μλλ€κ³ νλ¨νλ λμ μ€λ₯κ° μμ λ λκΉμ§ κΈ°λ€λ¦¬κ³ ,
μ€λ₯κ° ν΄κ²°λμλμ§ μ¬λΆλ₯Ό κ°μ§νμ¬ λ¬Έμ κ° μμ λ κ²μΌλ‘ 보μ΄λ©΄ μ ν리μΌμ΄μ μ΄ μμ νΈμΆμ μλν μ μμ΅λλ€.
π CircuitBreakerμ 3 κ°μ§ μν
Closed | Open | Half Open | |
μν© | μ μ | μ₯μ λ°μ | Open μνκ° λκ³ μΌμ μμ² νμ/μκ°μ΄ μ§λ μν©. Openκ³Ό Closed μ€ μ΄λ€ μνλ‘ λ³κ²½ν μ§μ λν νλ¨μ΄ μ΄λ£¨μ΄μ§λ μν© |
μμ²μ λν μ²λ¦¬ | μμ²μ λν μ²λ¦¬λ₯Ό μν μ ν΄μ§ νμ/λΉμ¨λ§νΌ μ€ν¨ν κ²½μ° μ₯μ μν©μΌλ‘ μΈμ§νμ¬ Open μνλ‘ λ³κ²½νκ² λλ€. |
ν μλΈλλ©μΈμΌλ‘μ μΈλΆ μμ²μ μ°¨λ¨νκ³ μλ¬λ₯Ό λ±κ±°λ μ§μ ν callback λ©μλλ₯Ό νΈμΆνμ¬ ν μ₯μ μν©μ λν΄ λμ²νλ€. |
μμ²μ λν μ²λ¦¬λ₯Ό μννκ³ μ€ν¨μ Open μνλ‘, μ±κ³΅μ Closed μνλ‘ λ³κ²½νλ€. |
βοΈ CircuitBreakerμμμ μ₯μ νλ¨μ κΈ°μ€μ μλμ κ°μ΅λλ€.
- slow call : κΈ°μ€λ³΄λ€ μ€λ κ±Έλ¦° μμ²
- failure call : μ€ν¨ νΉμ μ€λ₯ μλ΅μ λ°μ μμ²
βοΈ κ° μνλ μ§μ ν μμ± κ°μ ν΅ν΄ μ μ΄ν μ μμΌλ©° Resilience4jλ₯Ό ν΅ν ꡬνλΆμμ μ€λͺ νκ² μ΅λλ€.
π CircuitBreakerμ μνλ³κ²½
- Closed μνμμλ μ μ μμ² μν
- μ€ν¨ μκ³μΉ(failureRate Threshold or slowCallRateThreshold) λλ¬μ Closed μμ Opend μΌλ‘ μν λ³κ²½
- Open μνμμ μΌμ μκ°(waitDurationInOpenState) μμ μ Half Open μνλ‘ λ³κ²½
- Half Open μνμμμ μμ² μν
- μ§μ ν νμ(permittedNumberOfCallsInHalfOpenState) μν ν μ±κ³΅ μ Half Open μνμμ Closedλ‘ λ³κ²½
- μ§μ ν νμ(permittedNumberOfCallsInHalfOpenState) μν ν μ€ν¨ μ Half Open μνμμ Open μνλ‘ λ³κ²½
λ€μ ν¬μ€ν μμλ μ΄λ¬ν CircuitBreakerλ₯Ό μ€μ λ‘ κ΅¬ννλ λ°©λ²μ λν΄μ
μμ보λλ‘ νκ² μ΅λλ€. κ°μ¬ν©λλ€.
μΆμ²:
https://oliveyoung.tech/blog/2023-08-31/circuitbreaker-inventory-squad/
'BackEnd > SpringBoot' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
CircuitBreaker λ‘ μλ°©νλ μ₯μ μ ν(2) (0) | 2023.12.12 |
---|---|
Spring Transaction μ λν μ΄ν΄ (0) | 2023.09.20 |
[Spring] μ΄λ Έν μ΄μ μ μ μμ λμμ리 (0) | 2023.09.18 |
μ€νλ§ λΆνΈ λ‘컬 μΊμ μ μ©νκΈ° (0) | 2023.06.25 |
Feign Client λ₯Ό νμ©νμ¬ μΈλΆν΅μ μ°λνκΈ° (0) | 2023.04.22 |