반응형
Resilience4j는 Java 및 Spring Boot 애플리케이션에서 회복성(Resilience)을 관리하기 위한 경량화된 오픈소스 라이브러리입니다. 주로 마이크로서비스 아키텍처에서 네트워크 오류, 지연, 장애와 같은 문제에 대응할 수 있도록 설계되었습니다.
Resilience4j의 주요 기능
- Circuit Breaker (서킷 브레이커)
- 외부 서비스나 API 호출에서 장애가 지속되면 회로를 열어 더 이상의 요청을 차단합니다.
- 장애 회복 시 자동으로 회로를 닫아 요청을 재개합니다.
- Netflix의 Hystrix와 유사하지만 더 경량입니다.
- Rate Limiter (속도 제한)
- 특정 시간 동안의 요청 횟수를 제한하여 과도한 트래픽을 방지합니다.
- 예: "초당 최대 10개의 요청만 허용".
- Retry (재시도)
- 외부 서비스 호출이 실패했을 때 자동으로 재시도합니다.
- 재시도 횟수와 간격(예: 지수 백오프)을 설정할 수 있습니다.
- TimeLimiter (시간 제한)
- 특정 작업(예: 외부 API 호출)의 최대 실행 시간을 제한하고 타임아웃 시 예외를 발생시킵니다.
- Bulkhead (벌크헤드)
- 시스템 자원을 보호하기 위해 특정 서비스에 대한 동시 실행 수를 제한합니다.
- 이를 통해 하나의 서비스 장애가 전체 시스템에 영향을 미치는 것을 방지합니다.
- Cache (캐싱)
- 외부 서비스의 응답을 캐시하여 반복적인 호출을 줄이고 성능을 향상시킵니다.
- Fallback (대체 처리)
- 호출이 실패했을 경우, 대체 로직을 실행합니다.
- 예: 외부 API 호출이 실패하면 기본값이나 캐시된 데이터를 반환.
왜 Resilience4j를 사용할까?
- 경량성
- Resilience4j는 함수형 프로그래밍을 기반으로 하며, 라이브러리의 의존성이 적고 경량입니다.
- Java 8+ 지원
- Java 8 이상의 함수형 인터페이스 및 람다 표현식을 적극적으로 활용합니다.
- 유연한 모듈화
- 필요한 기능만 의존성에 추가해 사용할 수 있습니다. (예: Circuit Breaker만 추가)
- 마이크로서비스 환경 최적화
- 분산 시스템에서 발생할 수 있는 장애를 효과적으로 제어하고 복구합니다.
- Spring Boot 통합
- Spring Boot와의 통합이 쉬워 Spring Cloud에서 자주 사용됩니다.
Resilience4j 작동 원리: Circuit Breaker 예제
기본 동작
- Closed 상태:
- 정상 동작 상태. 모든 요청이 통과됩니다.
- 실패율이 특정 임계값에 도달하면 Open 상태로 전환됩니다.
- Open 상태:
- 요청이 차단되고, 바로 실패 응답을 반환합니다.
- 지정된 시간(예: 5초) 후에 Half-Open 상태로 전환됩니다.
- 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와 쉽게 통합되어 널리 사용됩니다.
반응형