카테고리 없음

Resilience4j란?

idea9329 2024. 12. 17. 17:03
반응형

 

Resilience4j Java 및 Spring Boot 애플리케이션에서 회복성(Resilience)을 관리하기 위한 경량화된 오픈소스 라이브러리입니다. 주로 마이크로서비스 아키텍처에서 네트워크 오류, 지연, 장애와 같은 문제에 대응할 수 있도록 설계되었습니다.


Resilience4j의 주요 기능

  1. Circuit Breaker (서킷 브레이커)
    • 외부 서비스나 API 호출에서 장애가 지속되면 회로를 열어 더 이상의 요청을 차단합니다.
    • 장애 회복 시 자동으로 회로를 닫아 요청을 재개합니다.
    • Netflix의 Hystrix와 유사하지만 더 경량입니다.
  2. Rate Limiter (속도 제한)
    • 특정 시간 동안의 요청 횟수를 제한하여 과도한 트래픽을 방지합니다.
    • 예: "초당 최대 10개의 요청만 허용".
  3. Retry (재시도)
    • 외부 서비스 호출이 실패했을 때 자동으로 재시도합니다.
    • 재시도 횟수와 간격(예: 지수 백오프)을 설정할 수 있습니다.
  4. TimeLimiter (시간 제한)
    • 특정 작업(예: 외부 API 호출)의 최대 실행 시간을 제한하고 타임아웃 시 예외를 발생시킵니다.
  5. Bulkhead (벌크헤드)
    • 시스템 자원을 보호하기 위해 특정 서비스에 대한 동시 실행 수를 제한합니다.
    • 이를 통해 하나의 서비스 장애가 전체 시스템에 영향을 미치는 것을 방지합니다.
  6. Cache (캐싱)
    • 외부 서비스의 응답을 캐시하여 반복적인 호출을 줄이고 성능을 향상시킵니다.
  7. Fallback (대체 처리)
    • 호출이 실패했을 경우, 대체 로직을 실행합니다.
    • 예: 외부 API 호출이 실패하면 기본값이나 캐시된 데이터를 반환.

왜 Resilience4j를 사용할까?

  1. 경량성
    • Resilience4j는 함수형 프로그래밍을 기반으로 하며, 라이브러리의 의존성이 적고 경량입니다.
  2. Java 8+ 지원
    • Java 8 이상의 함수형 인터페이스 및 람다 표현식을 적극적으로 활용합니다.
  3. 유연한 모듈화
    • 필요한 기능만 의존성에 추가해 사용할 수 있습니다. (예: Circuit Breaker만 추가)
  4. 마이크로서비스 환경 최적화
    • 분산 시스템에서 발생할 수 있는 장애를 효과적으로 제어하고 복구합니다.
  5. Spring Boot 통합
    • Spring Boot와의 통합이 쉬워 Spring Cloud에서 자주 사용됩니다.

Resilience4j 작동 원리: Circuit Breaker 예제

기본 동작

  1. Closed 상태:
    • 정상 동작 상태. 모든 요청이 통과됩니다.
    • 실패율이 특정 임계값에 도달하면 Open 상태로 전환됩니다.
  2. Open 상태:
    • 요청이 차단되고, 바로 실패 응답을 반환합니다.
    • 지정된 시간(예: 5초) 후에 Half-Open 상태로 전환됩니다.
  3. Half-Open 상태:
    • 일부 요청만 통과시켜 시스템의 회복 여부를 확인합니다.
    • 성공률이 임계값을 만족하면 Closed 상태로 돌아갑니다.

Spring Boot 예제

의존성 추가 (pom.xml):

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.7.1</version>
</dependency>

Circuit Breaker 설정 (application.yml):

resilience4j.circuitbreaker:
  instances:
    myService:
      failureRateThreshold: 50
      minimumNumberOfCalls: 5
      slidingWindowSize: 10
      waitDurationInOpenState: 10s

코드 예제:

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;

@Service
public class MyService {

    @CircuitBreaker(name = "myService", fallbackMethod = "fallback")
    public String callExternalService() {
        // 외부 API 호출
        return restTemplate.getForObject("https://example.com/api", String.class);
    }

    public String fallback(Throwable t) {
        return "External service is currently unavailable. Please try again later.";
    }
}

Resilience4j vs Hystrix

기능Resilience4jHystrix (Netflix)

경량성 경량 (Java 8 기반) 상대적으로 무거움
Java 버전 Java 8+ 지원 Java 6+
설정 방식 유연한 설정 및 모듈화 일체형으로 통합된 설정
기능 확장성 Circuit Breaker, Retry 등 Circuit Breaker 중심
활동성 활발히 유지보수 중 개발 중단 (Deprecated)

주요 사용 사례

  • 외부 API 호출: 네트워크 불안정 상황에 대한 회복성 제공.
  • 데이터베이스 장애: DB 연결 실패 시 재시도 또는 대체 로직 실행.
  • 서비스 간 트래픽 제한: 과부하 방지 및 자원 보호.

결론

Resilience4j 경량, 모듈화, 그리고 유연한 설정을 제공하는 Java 기반 회복성 관리 도구입니다. 마이크로서비스 아키텍처에서 발생하는 장애와 오류에 대응하여 안정적이고 회복력 있는 시스템을 구축하는 데 필수적인 라이브러리로, Spring Boot와 쉽게 통합되어 널리 사용됩니다.

반응형