โ๏ธ ์ถ๊ฐ ์ง์ : ์ํท๋ธ๋ ์ด์ปค(Circuit Breaker) ๊ฐ ๋ฌด์์ธ๊ฐ?

์ ๋ :
์ ๊ธฐ ํ๋ก์์ ๊ณผ์ด๋ ํ๋ก๋ฅผ ์ฐจ๋จํ๋ ์ฅ์น (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์๊ฐ๋์ ์ํท์ด ๋ช ๋ฒ ์ด๋ ธ์ง?”, “์ง๋ 7์ผ ๋์ ํน์ API ์คํจ์จ์ ์ด๋ ์ง?” ์ ๊ฐ์ ๋ถ์์ ํ ์ ์๋ค.
- ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ์ฌ ์ฅ์ ํจํด์ ๋ถ์ํ ์ ์๋ค.
- ์ฌ๋ฌ ์๋น์ค์ ๋ฉํธ๋ฆญ์ ํ ๊ณณ์์ ๊ด๋ฆฌ ๊ฐ๋ฅ
- Resilience4j Dashboard๋ ๊ฐ๋ณ ์ ํ๋ฆฌ์ผ์ด์ ์ Resilience4j์ ์ํ๋ง ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋นํด Phrometheus๋ ์ฌ๋ฌ ๊ฐ์ MSA์์ ์ค๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์์งํ๊ณ , ๋ชจ๋ํฐ๋งํ ์ ์๋ค.
- 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 ๊ฐ์
์ฐ์ํ ๊ธฐ์ ๋ธ๋ก๊ทธ | ๊ฐ๋ฐ์ ์์์ ํ๋ฆ๋๋ก ์ ์ฉํด๋ณด๋ ์ํท๋ธ๋ ์ด์ปค
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring JPA | Entity์ Dto ๋ถ๋ฆฌ (0) | 2025.02.17 |
---|---|
ํ๋ก์ ํธ | ์ค๊ณ ๋จ๊ณ์์ ํ์ฅ์ฑ์ ๋ํ ๊ณ ๋ฏผ (0) | 2025.02.12 |
TIL : ๋ฌธ์์ด ์ฌ๋ผ์ด์ฑ ์ธ๋ฑ์ค ์๋ฌ, ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ (0) | 2023.04.29 |
chrome debugging mode (0) | 2022.11.27 |
์ ๊ท์ - Oracle, JAVA (0) | 2022.11.11 |