본문 바로가기

Backend/MSA

241121 서킷 브레이커 (Resilience4j) 실습 TIL

서킷 브레이커란?

서킷 브레이커는 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 대시보드에서 시각화할 수 있다.