서킷 브레이커란?
서킷 브레이커는 MSA의 호출 실패를 감지하고 시스템의 전체적인 안정성을 유지하는 패턴이다.
Resilience4j란?
서킷 브레이커 라이브러리로, 서비스 간의 호출 실패를 감지하고 시스템의 안정성을 유지한다.
다양한 서킷 브레이커 기능을 제공한다.
서킷 브레이커 상태변화
- 클로즈드 (Closed)
기본 상태로, 모든 요청을 통과시킨다. 이 상태에서 호출이 실패하면 실패 카운터가 증가한다.
실패율이 설정된 임계값을 초과하면 오픈 상태로 전환된다.
- 오픈 (Open)
서킷 브레이커가 오픈 상태로 전환되면 모든 요청을 즉시 실패로 처리한다.
설정된 대기 시간이 지난 후, 서킷 브레이커는 하프-오픈 상태로 전환된다.
ex) 서킷 브레이커가 오픈 상태로 전환되고 20초 동안 모든 요청이 차단된다.
- 하프-오픈(Half-Open)
오픈 상태에서 대기 시간이 지나면 서킷 브레이커는 하프-오픈 상태로 전환된다.
제한된 수의 요청을 허용하여 시스템이 정상 상태로 복구되었는지 확인한다.
이때 요청 성공 -> 클로즈드 상태로 전환
이때 요청 다시 실패 -> 오픈 상태로 전환
ex) 하프-오픈 상태에서 3개의 요청을 허용하고, 모두 성공하면 클로즈드 상태로 전환. 하나라도 실패하면 다시 오픈 상태로 전환.
Fallback
호출 실패 시 대체 로직을 제공하여 시스템 안전성 확보한다.
에러 상황이 생겨도, 사용자에겐 에러가 아닌 것 처럼 대체 로직을 제공한다.
모니터링
Prometheus와 Granfana를 사용하여 Resilience4j 서킷 브레이커의 상태를 실시간으로 모니터링 할 수 있다. Prometheus를 통해 수집된 메트릭을 Grandana 대시보드에서 시각화할 수 있다.
Resilience4j 실습 해보기
Resilience4j 의존성 적용시 spring starter에서 추가해서 사용하면 정상 작동 x. 직접 Spring Boot 애플리케이션에 의존성을 추가해야 한다.
시나리오 : 상품을 조회할 때 상품 아이디 111을 호출하면 에러를 발생시켜 fallbackMethod 를 실행한다.
@CircuitBreaker(name = "productService", fallbackMethod = "fallbackGetProductDetails")
public Product getProductDetails(String productId) {
if ("111".equals(productId)) {
throw new RuntimeException("Empty response body");
}
return new Product(
productId,
"Sample Product"
);
}
public Product fallbackGetProductDetails(String productId, Throwable t) {
return new Product(
productId,
"Fallback Product"
);
}
이때 서킷 브레이커가 오픈 상태가 되면, getProductDetails 함수를 타지 않고 바로 fallbackGetProductDetails로 호출된다.
+) 프로메테우스 데이터 전달
http://localhost:19090/actuator/prometheus 로 접속하면 인스턴스의 상태 값들이 나오는데 여기서 서킷 브레이커 관련 내용을 확인하고 정보를 수집할 수 있다. 그리고 위에서 언급했던 것처럼 모니터링 시 수집한 자료를 Grandana 대시보드에서 시각화할 수 있다.
'Backend > MSA' 카테고리의 다른 글
241125 보안 구성 (OAuth2 + JWT) 실습 TIL (1) | 2024.11.25 |
---|---|
241122 API 게이트웨이 실습 TIL (0) | 2024.11.22 |
241121 클라이언트 사이드 로드 밸런싱 (FeignClient) 실습 TIL (2) | 2024.11.21 |
241120 서비스 디스커버리 (Eureka) 실습 TIL (0) | 2024.11.21 |
241120 MSA에 대해서 알아보자 TIL (1) | 2024.11.20 |