-
장애 격리시 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);
}
}
```
이러한 예시들은 서비스가 중단되었을 때도 사용자에게 유용한 응답을 제공하여 사용자 경험을 개선하고, 시스템의 신뢰성을 유지하는 데 도움이 됩니다.'자바 및 spring boot' 카테고리의 다른 글
레디스 캐시 쏠림, 쓰레싱 (0) 2024.06.02 스프링배치 대용량 데이터 처리 방법 (0) 2024.06.02 비동기 처리시 쓰레드 풀 관리 (0) 2024.06.02 ThreadLocal (0) 2024.05.22 트랜잭션, 선언적 트랜잭션 (0) 2024.05.22