ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 장애 격리시 retry 실패경우
    자바 및 spring boot 2024. 6. 2. 15:49

    재시도가 실패했을 때 대체 경로를 제공하는 것은, 시스템이 정상적으로 작동하지 않을 때도 최소한의 기능을 유지하여 사용자에게 유용한 응답을 제공하는 방법입니다. 다음은 몇 가지 상황과 이에 대한 예시를 들어 설명하겠습니다.

    ### 예시 1: 캐시된 데이터 사용

    #### 상황
    서비스가 현재 다운되어 DB에서 데이터를 가져올 수 없을 때, 이전에 캐시된 데이터를 반환하여 최소한의 정보를 제공합니다.

    #### 구현 예시

    ```java
    import org.springframework.stereotype.Service;

    @Service
    public class ProductService {

        // 캐시된 데이터
        private Map<String, Product> productCache = new HashMap<>();

        public ProductService() {
            // 캐시에 임의의 데이터 저장
            productCache.put("1", new Product("1", "Cached Product 1"));
            productCache.put("2", new Product("2", "Cached Product 2"));
        }

        public Product getProduct(String productId) {
            try {
                // 실제 데이터베이스 조회
                return fetchProductFromDatabase(productId);
            } catch (Exception e) {
                // 캐시된 데이터 반환
                return productCache.get(productId);
            }
        }

        private Product fetchProductFromDatabase(String productId) {
            // 실제 데이터베이스 호출 로직
            // 예시로 항상 예외를 발생시키도록 처리
            throw new RuntimeException("Database is down");
        }

        // Product 클래스 정의
        public static class Product {
            private String id;
            private String name;

            public Product(String id, String name) {
                this.id = id;
                this.name = name;
            }

            // getter, setter 생략
        }
    }
    ```

    ### 예시 2: 기본 값 사용

    #### 상황
    외부 API가 다운되어 데이터를 가져올 수 없을 때, 기본값을 사용하여 응답합니다.

    #### 구현 예시

    ```java
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;

    @Service
    public class WeatherService {

        private final RestTemplate restTemplate;

        public WeatherService(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }

        public String getWeather(String city) {
            try {
                // 외부 API 호출
                String url = "https://api.weather.com/v3/weather/forecast?city=" + city;
                return restTemplate.getForObject(url, String.class);
            } catch (Exception e) {
                // 기본 값 반환
                return "Weather data is currently unavailable. Please try again later.";
            }
        }
    }
    ```

    ### 예시 3: 제한된 기능 제공

    #### 상황
    주요 서비스가 다운되어 전체 기능을 제공할 수 없을 때, 제한된 기능만 제공하여 최소한의 사용자 경험을 유지합니다.

    #### 구현 예시

    ```java
    import org.springframework.stereotype.Service;

    @Service
    public class UserService {

        public User getUserDetails(String userId) {
            try {
                // 실제 서비스 호출
                return fetchUserDetailsFromService(userId);
            } catch (Exception e) {
                // 제한된 사용자 정보 제공
                return new User(userId, "Unknown", "Limited access. Full details are currently unavailable.");
            }
        }

        private User fetchUserDetailsFromService(String userId) {
            // 실제 서비스 호출 로직
            // 예시로 항상 예외를 발생시키도록 처리
            throw new RuntimeException("Service is down");
        }

        // User 클래스 정의
        public static class User {
            private String id;
            private String name;
            private String message;

            public User(String id, String name, String message) {
                this.id = id;
                this.name = name;
                this.message = message;
            }

            // getter, setter 생략
        }
    }
    ```

    ### 예시 4: 대체 서비스 사용

    #### 상황
    주요 서비스가 다운되었을 때, 대체 서비스나 백업 시스템을 통해 응답을 제공합니다.

    #### 구현 예시

    ```java
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;

    @Service
    public class SearchService {

        private final RestTemplate restTemplate;

        public SearchService(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
        }

        public String search(String query) {
            try {
                // 주요 검색 서비스 호출
                String url = "https://primary-search.com/api/search?q=" + query;
                return restTemplate.getForObject(url, String.class);
            } catch (Exception e) {
                // 대체 검색 서비스 호출
                return fallbackSearch(query);
            }
        }

        private String fallbackSearch(String query) {
            // 대체 검색 서비스 호출 로직
            String url = "https://backup-search.com/api/search?q=" + query;
            return restTemplate.getForObject(url, String.class);
        }
    }
    ```

    이러한 예시들은 서비스가 중단되었을 때도 사용자에게 유용한 응답을 제공하여 사용자 경험을 개선하고, 시스템의 신뢰성을 유지하는 데 도움이 됩니다.

Designed by Tistory.