2024. 9. 12. 09:41ㆍMSA
2024/09/12
서킷 브레이커라는 단어를 한 번 쯤 들어보셨나요?
주식 시장에서 서킷 브레이커는 주가지수의 상하 변동폭이
10%를 넘는 상태가 1분간 지속될 때
매매거래를 잠시 중단시키는 제도입니다.
과열된 회로를 차단한다는 뜻을 담고 있죠.
투자자들에게 잠시 숨돌릴 틈을 줘 이성을 되찾아
매매에 참가하라는 취지가 담겨있습니다.
갑자기 왜 뜬금없이 주식얘기가 나오냐고요?
MSA에서도 서킷 브레이커라는 개념이 등장하기 때문입니다.
오늘은 서킷 브레이커에 대해 알아보겠습니다.
※ 서킷 브레이커(Resilience4j)에 대해 알아보자.
▶ 서킷 브레이커 개요
● 서킷 브레이란?
○ 서킷 브레이커는 마이크로서비스 간의 호출 실패를 감지하고 시스템의 전체적인 안정성을 유지하는 패턴
○ 외부 서비스 호출 실패 시 빠른 실패를 통해 장애를 격리하고, 시스템의 다른 부분에 영향을 주지 않도록 한다.
○ 상태 변화 : 클로즈드 ➡️ 오픈 ➡️ 하프-오픈
▶ Resilience4j 개요
● Resilience4j란?
○ Resilience4j는 서킷 브레이커 라이브러리로, 서비스 간의 호출 실패를 감지하고 시스템의 안정성을 유지합니다.
○ 다양한 서킷 브레이커 기능을 제공하며, 장애 격리 및 빠른 실패를 통해 복원력을 높입니다.
● Resilience4j의 주요 특징
○ 서킷 브레이커 상태 : 클로즈드, 오픈, 하프-오픈 상태를 통해 호출 실패를 관리
📍 클로즈드(Closed) :
▪ 기본 상태로, 모든 요청을 통과시킨다.
▪ 이 상태에서 호출이 실패하면 실패 카운터가 증가한다.
▪ 실패율이 설정된 임계값(예: 50%)을 초과하면 서킷 브레이커가 오픈 상태로 전환된다.
▪ 예시: 최근 5번의 호출 중 3번이 실패하여 실패율이 60%에 도달하면 오픈 상태로 전환된다.
📍 오픈(Open) :
▪ 서킷 브레이커가 오픈 상태로 전환되면 모든 요청을 즉시 실패로 처리한다.
▪ 이 상태에서 요청이 실패하지 않고 바로 에러 응답을 반환한다.
▪ 설정된 대기 시간이 지난 후, 서킷 브레이커는 하프-오픈 상태로 전환된다.
▪ 예시: 서킷 브레이커가 오픈 상태로 전환되고 20초 동안 모든 요청이 차단된다.
📍 하프-오픈(Half-Open) :
▪ 오픈 상태에서 대기 시간이 지나면 서킷 브레이커는 하프-오픈 상태로 전환된다.
▪ 하프-오픈 상태에서는 제한된 수의 요청을 허용하여 시스템이 정상 상태로 복구되었는지 확인한다.
▪ 요청이 성공하면 서킷 브레이커는 클로즈드 상태로 전환된다.
▪ 요청이 다시 실패하면 서킷 브레이커는 다시 오픈 상태로 전환된다.
▪ 예시: 하프-오픈 상태에서 3개의 요청을 허용하고, 모두 성공하면 클로즈드 상태로 전환된다.
▪ 만약 하나라도 실패하면 다시 오픈 상태로 전환된다.
○ Fallback : 호출 실패 시 대체 로직을 제공하여 시스템 안정성 확보
○ 모니터링 : 서킷 브레이커 상태를 모니터링하고 관리할 수 있는 다양한 도구 제공
▶ Resilience4j 설정
● 기본 설정
⚠️ resilience4j 의존성은 spring starter에서 추가하여 사용하지 않을 것이다.
”io.github.resilience4j:resilience4j-spring-boot3:2.2.0” 를 사용한다.
”boot3” 임을 주의 하자❗
○ Resilience4j를 사용하려면 Spring Boot 애플리케이션에 의존성을 추가해야 한다.
📌 build.gradle 파일 예시 :
dependencies {
implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0'
implementation 'org.springframework.boot:spring-boot-starter-aop'
}
● Resilience4j 설정 파일
○ Resilience4j의 설정은 application.yml 파일에서 설정할 수 있다.
📌 예시 설정 파일 :
YAML
resilience4j:
circuitbreaker:
configs:
default: # 기본 구성 이름
registerHealthIndicator: true # 애플리케이션의 헬스 체크에 서킷 브레이커 상태를 추가하여 모니터링 가능
# 서킷 브레이커가 동작할 때 사용할 슬라이딩 윈도우의 타입을 설정
# COUNT_BASED: 마지막 N번의 호출 결과를 기반으로 상태를 결정
# TIME_BASED: 마지막 N초 동안의 호출 결과를 기반으로 상태를 결정
slidingWindowType: COUNT_BASED # 슬라이딩 윈도우의 타입을 호출 수 기반(COUNT_BASED)으로 설정
# 슬라이딩 윈도우의 크기를 설정
# COUNT_BASED일 경우: 최근 N번의 호출을 저장
# TIME_BASED일 경우: 최근 N초 동안의 호출을 저장
slidingWindowSize: 5 # 슬라이딩 윈도우의 크기를 5번의 호출로 설정
minimumNumberOfCalls: 5 # 서킷 브레이커가 동작하기 위해 필요한 최소한의 호출 수를 5로 설정
slowCallRateThreshold: 100 # 느린 호출의 비율이 이 임계값(100%)을 초과하면 서킷 브레이커가 동작
slowCallDurationThreshold: 60000 # 느린 호출의 기준 시간(밀리초)으로, 60초 이상 걸리면 느린 호출로 간주
failureRateThreshold: 50 # 실패율이 이 임계값(50%)을 초과하면 서킷 브레이커가 동작
permittedNumberOfCallsInHalfOpenState: 3 # 서킷 브레이커가 Half-open 상태에서 허용하는 최대 호출 수를 3으로 설정
# 서킷 브레이커가 Open 상태에서 Half-open 상태로 전환되기 전에 기다리는 시간
waitDurationInOpenState: 20s # Open 상태에서 Half-open 상태로 전환되기 전에 대기하는 시간을 20초로 설정
▶ Fallback 메커니즘
● Fallback 설정
○ Fallback 메서드는 외부 서비스 호출이 실패했을 때 대체 로직을 제공하는 메서드다.
📌 예시 코드 :
@Service
public class MyService {
@CircuitBreaker(name = "myService", fallbackMethod = "fallbackMethod")
public String myMethod() {
// 외부 서비스 호출
return externalService.call();
}
public String fallbackMethod(Throwable t) {
return "Fallback response";
}
}
● Fallback의 장점
○ 시스템의 안정성을 높이고, 장애가 발생해도 사용자에게 일정한 응답을 제공할 수 있다.
○ 장애가 다른 서비스에 전파되는 것을 방지한다.
▶ Resilience4j Dashboard
● Resilience4j Dashboard 설정
○ Resilience4j Dashboard를 사용하여 서킷 브레이커의 상태를 모니터링할 수 있다.
📌 build.gradle 파일 예시 :
dependencies {
implementation 'io.github.resilience4j:resilience4j-micrometer'
implementation 'io.micrometer:micrometer-registry-prometheus'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
○ 설정은 application.yml 파일에서 설정할 수 있다.
📌 예시 코드 :
management:
endpoints:
web:
exposure:
include: prometheus
prometheus:
metrics:
export:
enabled: true
○ http://${hostname}:${port}/actuator/prometheus 에 접속하여 서킷브레이커 항목 확인이 가능하다.
● Resilience4j Dashboard 사용
○ Prometheus와 Grafana를 사용하여 Resilience4j 서킷 브레이커의 상태를 실시간으로 모니터링할 수 있다.
○ Prometheus를 통해 수집된 메트릭을 Grafana 대시보드에서 시각화할 수 있다.
▶ Resilience4j와 Spring Cloud 연동
● Spring Cloud와의 통합
○ Resilience4j는 Spring Cloud Netflix 패키지의 일부로, Eureka와 Ribbon 등 다른 Spring Cloud 구성 요소와 쉽게 통합할 수 있다.
○ Spring Cloud의 서비스 디스커버리와 로드 밸런싱을 활용하여 더욱 안정적인 마이크로서비스 아키텍처를 구축할 수 있다.
📌 예시 설정 파일 :
YAML
spring:
application:
name: my-service
cloud:
circuitbreaker:
resilience4j:
enabled: true
'MSA' 카테고리의 다른 글
이벤트 드리븐 아키텍처와 스트림 처리 (1) | 2024.09.24 |
---|---|
분산 추적(Spring Cloud Sleuth) 및 로깅(Zipkin) (2) | 2024.09.24 |
MSA 보안 구성 - OAuth2 + JWT (0) | 2024.09.23 |
클라이언트 사이드 로드 밸런싱 - FeignClient와 Ribbon (0) | 2024.09.11 |
MSA - Microservices Architecture란? (1) | 2024.09.09 |