폴백(Fallback)은 Resilience4j에서 복원력을 제공하기 위한 핵심 메커니즘 중 하나입니다. 폴백은 주요 작업(예: API 호출, 데이터베이스 쿼리 등)이 실패하거나 예외가 발생했을 때 대체 동작을 정의하여 서비스의 가용성을 유지하는 데 사용됩니다.
1. 폴백의 주요 특징
- 대체 동작 제공: 특정 작업이 실패했을 때 예외를 던지지 않고 미리 정의된 대체 로직을 실행합니다.
- 최종 방어선: 회로차단기, 재시도, 벌크헤드 등 모든 복원력 기능을 통과했음에도 실패했을 때 작동합니다.
- 사용자 정의 로직: 기본값 반환, 캐시된 데이터 제공, 알림 전송 등 사용자 정의 로직을 구현할 수 있습니다.
2. 폴백의 동작 방식
- 서비스 호출:
- 특정 메서드 호출 시 장애가 발생하거나 예외가 발생합니다.
- Resilience4j 동작:
- 재시도, 회로차단기 등 설정된 복원력 기능이 작동합니다.
- 최종 실패:
- 모든 복원력 기능이 실패하면 폴백 메서드가 호출됩니다.
- 폴백 처리:
- 폴백 메서드에서 미리 정의된 대체 동작을 수행합니다.
3. 폴백의 주요 설정 및 코드 예시
예외 발생 시 폴백 처리
- 특정 메서드가 실패했을 때 폴백 메서드를 호출하도록 설정합니다.
- 폴백 메서드는 실패의 원인을 파악하고 적절한 응답을 반환합니다.
import io.github.resilience4j.retry.annotation.Retry;
public class ExternalService {
// 네트워크 호출
@Retry(name = "retryService", fallbackMethod = "fallbackForService")
public String callExternalService() {
// 외부 서비스 호출
throw new RuntimeException("Service unavailable");
}
// 폴백 메서드
public String fallbackForService(RuntimeException e) {
return "Fallback response due to: " + e.getMessage();
}
}
Fallback 메서드 요구사항
- 폴백 메서드는 원래 메서드와 동일한 반환값을 가져야 합니다.
- 마지막 매개변수로 예외(Exception)를 받을 수 있습니다.
4. 폴백의 적용 사례
1) 기본값 반환
- 외부 API 호출이 실패하면 기본값을 반환하여 서비스 중단을 방지합니다.
@Retry(name = "defaultService", fallbackMethod = "defaultResponse")
public String callApi() {
throw new RuntimeException("API Unavailable");
}
public String defaultResponse(Exception e) {
return "Default Response";
}
2) 캐시된 데이터 반환
@Retry(name = "cacheService", fallbackMethod = "fallbackToCache")
public String fetchData() {
throw new RuntimeException("Database unavailable");
}
public String fallbackToCache(RuntimeException e) {
return "Cached Data";
}
3) 알림 전송
- 실패 시 관리자에게 알림을 보내거나 로깅하여 문제를 기록합니다.
@Retry(name = "notificationService", fallbackMethod = "sendAlert")
public String executeCriticalTask() {
throw new RuntimeException("Critical task failed");
}
public String sendAlert(Exception e) {
// 알림 전송 로직
System.out.println("Alert sent: " + e.getMessage());
return "Fallback executed after alert";
}
5. YAML 설정과 폴백
Resilience4j를 사용하여 폴백을 구현할 때 주로 Retry와 함께 설정합니다.
resilience4j.retry:
instances:
retryService:
max-attempts: 3 # 최대 재시도 횟수
waitDuration: 500ms # 재시도 간격
retry-exceptions: # 재시도 대상 예외
- java.util.concurrent.TimeoutException
- java.io.IOException
6. 폴백과 관련된 주요 개념
- 장점:
- 서비스의 중단을 방지.
- 사용자에게 최소한의 응답 제공.
- 장애 발생 시 빠른 복구 가능.
- 한계:
- 폴백 로직은 종종 제한된 기능만 제공.
- 잘못 설계된 폴백은 장애를 감추어 문제를 악화시킬 수 있음.
7. 폴백 사용 시 고려사항
- 폴백 메서드는 간단하고 신뢰할 수 있어야 합니다.
- 폴백이 자원(예: 캐시) 의존성을 가지는 경우 해당 자원이 충분히 안정적인지 확인해야 합니다.
- 폴백 로직에 대한 테스트와 검증이 필요합니다.
폴백은 서비스의 안정성을 높이고 사용자 경험을 개선하는 데 중요한 역할을 합니다. 이를 효과적으로 활용하려면 주어진 요구 사항에 맞는 적절한 폴백 로직을 설계해야 합니다.
'MSA' 카테고리의 다른 글
refresh (0) | 2024.12.16 |
---|---|
Netflix Zuul ( API 게이트웨이 ) (1) | 2024.12.16 |
Resilience4j (0) | 2024.12.13 |
allow-bean-definition-overriding (1) | 2024.12.11 |
@ConfigurationProperties (0) | 2024.12.11 |