๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL

MSA | ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค (feat. Resilience4j)

by bamDal 2025. 2. 11.

โ‡๏ธ ์ถ”๊ฐ€ ์ง€์‹ : ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค(Circuit Breaker) ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?

๋”๋ณด๊ธฐ
์ถœ์ฒ˜ : https://ko.wikipedia.org/wiki/ํšŒ๋กœ_์ฐจ๋‹จ๊ธฐ

์œ ๋ž˜ : 
  ์ „๊ธฐ ํšŒ๋กœ์—์„œ ๊ณผ์—ด๋œ ํšŒ๋กœ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์žฅ์น˜ (a.k.a. ๋‘๊บผ๋น„์ง‘)

์“ฐ์ž„ :
  ์ฃผ์‹ ์‹œ์žฅ - ์ฃผ๊ฐ€๊ฐ€ ๊ฐ‘์ž๊ธฐ ๊ธ‰๋ฝํ•  ๋•Œ, ์ฃผ์‹๋งค๋งค ์ผ์‹œ ์ •์ง€ํ•˜๋Š” ์ œ๋„
  ์†Œํ”„ํŠธ์›จ์–ด - ์žฅ์• ์ „ํŒŒ ์ฐจ๋‹จ์„ ๋ชฉ์ ์œผ๋กœ ์‹œ์Šคํ…œ ๊ฐ„ ์—ฐ๋™์„ ์ฐจ๋‹จํ•˜๋Š” ๊ธฐ์ˆ 

< ์ •์˜ >

์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๋ผ๋ฆฌ ์—ฐ๋™ํ•  ๋•Œ, ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์„œ๋น„์Šค๋กœ์˜ ์š”์ฒญ์„ ์ผ์‹œ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜์—ฌ, ์žฅ์• ์ „ํŒŒ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š”๊ธฐ์ˆ 

๋ชฉ์  : ์‹œ์Šคํ…œ์˜ ์ „์ฒด์ ์ธ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋Šฅ :

  • ์‹œ์Šคํ…œ ์—ฐ๋™ ์‹œ, ํ˜ธ์ถœ ์‹คํŒจ ๊ฐ์ง€
  • ์ดํ›„ ํšŒ๋ณต์‹œ, ์ž๋™์œผ๋กœ ์‹œ์Šคํ…œ ์—ฐ๋™

 

< ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ์ƒํƒœ >

1. ํด๋กœ์ฆˆ๋“œ (CLOSED)

  • ์„œ๋น„์Šค๊ฐ€ ์ •์ƒ ํ˜ธ์ถœ/์‘๋‹ต ๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ

2. ์˜คํ”ˆ (OPEN)

  • ๋ฌธ์ œ ๋ฐœ์ƒ์ด ๊ฐ์ง€๋œ ์ƒํƒœ

3. ํ•˜ํ”„-์˜คํ”ˆ (HALF_OPEN)

  • ์„œ๋น„์Šค๊ฐ€ ์˜คํ”ˆ ์ƒํƒœ๊ฐ€ ๋œ ํ›„ ํŠน์ • ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ „ํ™˜๋˜๋Š” ์ƒํƒœ

์œ„์˜ 3๊ฐ€์ง€ ๋ณดํ†ต ์ƒํƒœ์™€ ์•„๋ž˜์˜ ํŠน๋ณ„ ์ƒํƒœ๊ฐ€ 2๊ฐœ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
์ด๋ฒˆ์—๋Š” ๋ณดํ†ต ์ƒํƒœ๋งŒ ์ •๋ฆฌํ–ˆ๋‹ค.

4. DISABLED

  • ํ•ญ์ƒ ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜๋Š” ์ƒํƒœ

5. FORCED_OPEN

  • ํ•ญ์ƒ ํ˜ธ์ถœ์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ์ƒํƒœ

 

< ์ƒํƒœ ๋ณ€ํ™” ๊ฒฐ์ • ๋ฐฉ์‹ >

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„(Sliding window)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ์˜ ๋ณ€ํ™”์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„ ๋ฐฉ์‹์€ ํšŸ์ˆ˜ ๋ฐฉ์‹(COUNT_BASED)๊ณผ ์‹œ๊ฐ„ ๋ฐฉ์‹(TIME_BASED)์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ทธ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์ธ๊ฐ€..? ๋‚˜์ค‘์— ์•Œ์•„๋ณด๊ธฐ๋กœ ํ•˜์ž……………….

 

1. ์ •ํ•ด์ง„ ํ™•๋ฅ ๋ณด๋‹ค ๋†’์€ ํ™•๋ฅ ๋กœ ํ˜ธ์ถœ์— ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉด ์ƒํƒœ๋ฅผ OPEN์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

2. OPEN ์ƒํƒœ์—์„œ๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐ”๋กœ ํ˜ธ์ถœ ์‹คํŒจ Exception ๋ฐœ์ƒ ๋˜๋Š” ์ •ํ•ด์ง„ fallback ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

3. OPEN ์ดํ›„ ์„ค์ •ํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด HALF_OPEN ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉฐ, ํ˜ธ์ถœ์ด ์ •์ƒํ™”๋˜์—ˆ๋Š”์ง€ 1๋ฒˆ์˜ ์‹คํŒจ ํ™•๋ฅ ๋กœ ํ™•์ธํ•œ๋‹ค.

4. ์ •์ƒํ™” ์—ฌ๋ถ€์— ๋”ฐ๋ผ CLOSED์™€ OPEN ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

 

 

< Fallback ๋ฉ”์ปค๋‹ˆ์ฆ˜ >

์„œ๋น„์Šค ํ˜ธ์ถœ์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ fallback method๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

fallback method

  • ์š”์ฒญ์— ์‹คํŒจํ•œ ์„œ๋น„์Šค์˜ ๋Œ€์ฒด ๋กœ์ง
public String fallbackMethod(Throwable t) {
    // ํ•„์š”ํ•œ ๋กœ์ง ์ž‘์„ฑ
    return "Fallback response";
}

๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„์— ์ฃผ๋กœ

์„œ๋น„์Šค ํ˜ธ์ถœ ์‹คํŒจ ์‹œ ์•Œ๋ฆผ ์„ค์ • (์ฃผ๋กœ Slack, MM, ๋“ฑ SMS) ์ด๋‚˜ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์•Œ๋ฆด ๋ฉ”์‹œ์ง€๋‚˜ ๋Œ€์ฒด ํŽ˜์ด์ง€ ๋“ฑ์„ ์„ค์ •ํ•œ๋‹ค.

์žฅ์ 

  • ์žฅ์•  ๋ฐœ์ƒ ์‹œ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ผ์ •ํ•œ ์‘๋‹ต(๋ฌด๋ถ„๋ณ„ํ•œ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ณด๋‹จ ์•Œ๋ฆผ, ๊ณต์ง€ ๋“ฑ) ์ œ๊ณต ๊ฐ€๋Šฅ

 

โœจ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ์ƒํƒœ ๋ฐ ์ƒํƒœ ๋ณ€ํ™” ๋™์ž‘ (์ •๋ฆฌ)

๋”๋ณด๊ธฐ

ํด๋กœ์ฆˆ๋“œ (CLOSED)

  • ์„œ๋น„์Šค๊ฐ€ ์ •์ƒ ํ˜ธ์ถœ/์‘๋‹ต ๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ (๊ธฐ๋ณธ ์ƒํƒœ)
  • — ๋™์ž‘
  • ํ˜ธ์ถœ ์‹คํŒจ ์‹œ, ์‹คํŒจ ์นด์šดํ„ฐ๊ฐ€ ์ฆ๊ฐ€
  • ์„ค์ •ํ•ด๋‘” ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด OPEN ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
  • ์˜ˆ์‹œ : ์„ค์ •ํ•œ ์ž„๊ณ„๊ฐ’์ด 50%์ผ ๋•Œ, 5๋ฒˆ์˜ ํ˜ธ์ถœ ์ค‘ 3๋ฒˆ์ด ์‹คํŒจํ•˜์—ฌ ์‹คํŒจ์œจ์ด 60%๊ฐ€ ๋˜๋ฉด OPEN ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ

์˜คํ”ˆ (OPEN)

  • ๋ฌธ์ œ ๋ฐœ์ƒ์ด ๊ฐ์ง€๋œ ์ƒํƒœ
  • — ๋™์ž‘
  • ๋ชจ๋“  ์š”์ฒญ์„ ์ฆ‰์‹œ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์„ค์ •๋œ ๋™์ž‘(์—๋Ÿฌ ์‘๋‹ต ๋˜๋Š” fallback)์„ ์ˆ˜ํ–‰
  • ์„ค์ •๋œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด, HALF_OPEN ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
  • ์˜ˆ์‹œ : ์„ค์ •ํ•œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด 20์ดˆ์ผ ๋•Œ, OPEN ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด 20์ดˆ ๋™์•ˆ ๋ชจ๋“  ์š”์ฒญ์ด ์ฐจ๋‹จ

ํ•˜ํ”„-์˜คํ”ˆ (HALF_OPEN)

  • ์„œ๋น„์Šค๊ฐ€ ์˜คํ”ˆ ์ƒํƒœ๊ฐ€ ๋œ ํ›„ ํŠน์ • ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ „ํ™˜๋˜๋Š” ์ƒํƒœ

— ๋™์ž‘

  • ์ œํ•œ๋œ ์ˆ˜์˜ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์ •์ƒํ™” ์—ฌ๋ถ€๋ฅผ ํ™•์ธ
  • ์š”์ฒญ ๋ชจ๋‘ ์„ฑ๊ณต → CLOSED ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
  • ์š”์ฒญ ์‹คํŒจ → OPEN ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
  • ์˜ˆ์‹œ : ์š”์ฒญ ํ—ˆ์šฉ ์ˆ˜๊ฐ€ 3๊ฐœ์ผ ๋•Œ, 3๋ฒˆ์˜ ์š”์ฒญ์„ ๋ชจ๋‘ ์„ฑ๊ณตํ•˜๋ฉด CLOSED ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด OPEN ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ

 


 

๐Ÿ“Resilience4j

์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด Resilience4j๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Spring Cloud์—์„œ Hystrix (๋„ทํ”Œ๋ฆญ์Šค๊ฐ€ ๊ฐœ๋ฐœํ•œ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ์ง€๋งŒ,

maintenance ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜์–ด Resilience4j๊ฐ€ ๋Œ€์ฒด ๋ชจ๋“ˆ๋กœ ์„ ํƒ๋˜์—ˆ๋‹ค.

โš ๏ธ maintenance ๋ชจ๋“œ ? (์œ ์ง€๋ชจ๋“œ) 

  • ์Šคํ”„๋ง ๋ฒ„์ „์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋˜๋ฉด์„œ ๋” ์ด์ƒ ํ•ด๋‹น ๋ชจ๋“ˆ์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ

 

< Resilience4j ์„ค์ • >

1. ์˜์กด์„ฑ

Spring boot์—์„œ resilience4j๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ start.spring.io ์—์„œ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

spring starter์—์„œ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ตฌํ˜„์ฒด๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋“ค์–ด์˜ค๋ฏ€๋กœ ๊ตฌํ˜„์ฒด๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ๋”ฐ๋ผ์„œ resilience4j ํ”„๋กœ์ ํŠธ ๊นƒํ—™์„ ์ฐธ๊ณ ํ•ด์„œ ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•œ๋‹ค.

dependencies {
    // spring boot ๋ฒ„์ „์— ๋”ฐ๋ผ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉ
    implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
	  implementation 'org.springframework.boot:spring-boot-starter-aop'
}

์ถœ์ฒ˜ : https://resilience4j.readme.io/docs/getting-started-3

2. application ์„ค์ •

์•ž์„œ ์„ค์ •ํ•ด๋‘” ์ž„๊ณ„๊ฐ’, ์‹œ๊ฐ„ ๋“ฑ์„ ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ ๊ทธ ๊ฐ’๋“ค์€ ์„ค์ • ํŒŒ์ผ์—์„œ ์ง€์ •ํ•œ๋‹ค.

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„ค์ • ์˜ต์…˜์€ ๋งŽ์ง€๋งŒ ๋ฌด์˜๋ฏธํ•œ ์ฝ”๋“œ ๋ณต๋ถ™์€ TIL์— ํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ–ˆ์œผ๋ฏ€๋กœ ์Šคํ‚ต

 

< Resilience4j Dashboard์™€ Prometheous >

Resilience4j Dashboard๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ Prometheous๋„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋กœ ์•Œ๊ณ  ์žˆ๋Š”๋ฐ ์™œ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

โš ๏ธ Resilience4j Dashboard๋ž‘ Prometheus ๋Š” ๋ญ๊ฐ€ ๋‹ค๋ฅธ๊ฑฐ์ง€?

Resilience4j Dashboard

  • ์ฃผ์š” ๊ธฐ๋Šฅ : Resilience4j์˜ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ
  • ์‚ฌ์šฉ ๋ชฉ์  : ์žฅ์•  ๋ณต์›๋ ฅ(resilience)์„ ๊ด€๋ฆฌํ•˜๊ณ , ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๊ฐ€ ์—ด๋ ธ๋Š”์ง€, ์‹คํŒจ์œจ์ด ๋†’์€์ง€ ๋“ฑ์„ ํ™•์ธ
  • ๋Œ€์‹œ๋ณด๋“œ : Spring Boot Actuator ์•ค๋“œ ํฌ์ธํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์‹œ๊ฐํ™”ํ•œ๋‹ค.

Prometheus

  • ์ฃผ์š” ๊ธฐ๋Šฅ : ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ํ•˜๋Š” ๊ฒƒ
  • ์‚ฌ์šฉ ๋ชฉ์  : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ (CPU ์‚ฌ์šฉ๋Ÿ‰, ๋ฉ”๋ชจ๋ฆฌ, ์š”์ฒญ ์ˆ˜, ์˜ค๋ฅ˜์œจ ๋“ฑ)
  • ๋Œ€์‹œ๋ณด๋“œ : Grafana์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

Prometheus๋Š” ์ผ๋ฐ˜์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์ด๊ณ , Resilience4j Dashboard๋Š” ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ๋ฐ ์žฅ์•  ๋ณต์›๋ ฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.
๋”ฐ๋ผ์„œ, Resilience4j์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”ํŠธ๋ฆญ์„ Prometheus๋กœ ๋ณด๋‚ด์„œ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ™œ์šฉํ•œ๋‹ค.

 

โš ๏ธ ๋‘˜ ๋‹ค ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์ธ๋ฐ ์™œ ๊ตณ์ด Prometheus๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒ„..??

Prometheus์™€ Resilience4j Dashboard๋Š” ์—ญํ• ๊ณผ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค.

Resilience4j Dashboard

  • ์‹ค์‹œ๊ฐ„ ์ƒํƒœ ํ™•์ธ์šฉ
  • Resilience4j ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค.
  • ๊ฐœ๋ณ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์žฅ์•  ๋ณต์›๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์žฅ๊ธฐ์ ์ธ ๋งคํŠธ๋ฆญ ์ €์žฅ์ด๋‚˜ ๋ถ„์„ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜๋‹ค.

Prometheus

  1. ์žฅ๊ธฐ์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๋ถ„์„์šฉ
    • ์žฅ๊ธฐ์ ์ธ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
    • “์ง€๋‚œ 1์‹œ๊ฐ„๋™์•ˆ ์„œํ‚ท์ด ๋ช‡ ๋ฒˆ ์—ด๋ ธ์ง€?”, “์ง€๋‚œ 7์ผ ๋™์•ˆ ํŠน์ • API ์‹คํŒจ์œจ์€ ์–ด๋• ์ง€?” ์™€ ๊ฐ™์€ ๋ถ„์„์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์žฅ์•  ํŒจํ„ด์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์˜ ๋ฉ”ํŠธ๋ฆญ์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
    • Resilience4j Dashboard๋Š” ๊ฐœ๋ณ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Resilience4j์˜ ์ƒํƒœ๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์— ๋น„ํ•ด Phrometheus๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ MSA์—์„œ ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ˆ˜์ง‘ํ•˜๊ณ , ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. Grafana์™€ ์—ฐ๋™ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

< ๊ฒฐ๋ก  >

  • Resilience4j Dashboard๋Š” ๊ฐœ๋ณ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์‹œ๊ฐ„ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ์šฉ๋„
  • Prometheus๋Š” ์žฅ๊ธฐ์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๋ถ„์„์„ ์œ„ํ•ด ํ•„์š”
  • Prometheus์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ฉด ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์˜ ์žฅ์•  ํŒจํ„ด์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ
  • Grafana์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๋” ๊ฐ•๋ ฅํ•œ ์‹œ๊ฐํ™” ๊ฐ€๋Šฅ

 

< ๋ชจ๋‹ˆํ„ฐ๋ง ์„ค์ • >

1. ์˜์กด์„ฑ

dependencies {
    implementation 'io.github.resilience4j:resilience4j-micrometer'
    implementation 'io.micrometer:micrometer-registry-prometheus'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

start.spring.io ์—์„œ prometheus์™€ actuator๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

resilience4j-micrometer๋Š” resilience4j ํ”„๋กœ์ ํŠธ ๊นƒํ—™์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ์„ค๋ช…์„ ํ†ตํ•ด์„œ micrometer๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ชจ๋“ˆ์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Resilience4j๋Š” InfluxDB ๋˜๋Š” Prometheus์™€ ๊ฐ™์€ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ์ง€์›ํ•˜๋Š” Micrometer์šฉ ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ถœ์ฒ˜ : https://resilience4j.readme.io/docs/micrometer

 

1. ์„ค์ • ํŒŒ์ผ

application ์„ค์ • ํŒŒ์ผ์—์„œ endpoint๋กœ prometheus๋ฅผ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

management:
  endpoints:
    web:
      exposure:
        include: prometheus
  prometheus:
    metrics:
      export:
        enabled: true

๊ทธ๋Ÿฌ๋ฉด http://${hostname}:${port}/actuator/prometheus ๋กœ ์ ‘์†ํ•ด์„œ ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค ํ•ญ๋ชฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โš ๏ธ actuator๋Š” ๋ญ”๋ฐ ์˜์กด์„ฑ์—๋„ ๋“ฑ์žฅํ•˜๊ณ , endpoint๋กœ ์ฃผ์†Œ์—๋„ ๋“ฑ์žฅํ•˜๋Š” ๊ฑธ๊นŒ..?

Spring Boot Actuator ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ์™€ ์šด์˜ ์ •๋ณด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ REST API ์•ค๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

actuator/{sth} ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ํŠน์ • ์•ค๋“œํฌ์ธํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 


์ฐธ๊ณ  ๊ฐ•์˜/๊ธ€

์ŠคํŒŒ๋ฅดํƒ€ ์ฝ”๋”ฉ MSA ๊ฐ•์˜
์šฐ์•„ํ•œ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ | ๊ฐœ๋ฐœ์ž ์˜์‹์˜ ํ๋ฆ„๋Œ€๋กœ ์ ์šฉํ•ด๋ณด๋Š” ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค