BackEnd/SpringBoot

CircuitBreaker 둜 μ˜ˆλ°©ν•˜λŠ” μž₯μ•  μ „νŒŒ(1)

hyunki.Dev 2023. 12. 10. 14:04

πŸ“Œ λ“€μ–΄κ°€λ©°

μ†Œν”„νŠΈμ›¨μ–΄λŠ” λͺ¨λ‘ μ‹€νŒ¨ν•œλ‹€ - λ²„λ„ˆ λ³΄κ²”μŠ€(μ•„λ§ˆμ‘΄ 뢀사μž₯)

 

 μ•„무리 μ—΄μ‹¬νžˆ μ„€κ³„ν•˜μ—¬ κ°œλ°œν•˜κ³  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μ—μ„œμ˜ μž₯μ•  νŒλ‹¨μ˜ 기쀀은 μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

  1. slow call : 기쀀보닀 였래 κ±Έλ¦° μš”μ²­
  2. 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://velog.io/@akfls221/resilience4j-%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-%EC%84%9C%ED%82%B7%EB%B8%8C%EB%A0%88%EC%9D%B4%EC%BB%A4%ED%8C%A8%ED%84%B4CircuitBreaker

https://oliveyoung.tech/blog/2023-08-31/circuitbreaker-inventory-squad/