본문 바로가기
MSA

폴백(Fallback)

by xogns93 2024. 12. 13.

폴백(Fallback)은 Resilience4j에서 복원력을 제공하기 위한 핵심 메커니즘 중 하나입니다. 폴백은 주요 작업(예: API 호출, 데이터베이스 쿼리 등)이 실패하거나 예외가 발생했을 때 대체 동작을 정의하여 서비스의 가용성을 유지하는 데 사용됩니다.


1. 폴백의 주요 특징

  • 대체 동작 제공: 특정 작업이 실패했을 때 예외를 던지지 않고 미리 정의된 대체 로직을 실행합니다.
  • 최종 방어선: 회로차단기, 재시도, 벌크헤드 등 모든 복원력 기능을 통과했음에도 실패했을 때 작동합니다.
  • 사용자 정의 로직: 기본값 반환, 캐시된 데이터 제공, 알림 전송 등 사용자 정의 로직을 구현할 수 있습니다.

2. 폴백의 동작 방식

  1. 서비스 호출:
    • 특정 메서드 호출 시 장애가 발생하거나 예외가 발생합니다.
  2. Resilience4j 동작:
    • 재시도, 회로차단기 등 설정된 복원력 기능이 작동합니다.
  3. 최종 실패:
    • 모든 복원력 기능이 실패하면 폴백 메서드가 호출됩니다.
  4. 폴백 처리:
    • 폴백 메서드에서 미리 정의된 대체 동작을 수행합니다.

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. 폴백과 관련된 주요 개념

  1. 장점:
    • 서비스의 중단을 방지.
    • 사용자에게 최소한의 응답 제공.
    • 장애 발생 시 빠른 복구 가능.
  2. 한계:
    • 폴백 로직은 종종 제한된 기능만 제공.
    • 잘못 설계된 폴백은 장애를 감추어 문제를 악화시킬 수 있음.

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