Вопрос проверяет знание методов обработки сбоев внешних сервисов в микросервисной архитектуре.
Для обработки недоступности внешнего сервиса используют таймауты, ретраи, Circuit Breaker и Fallback. Таймауты ограничивают время ожидания, ретраи повторяют запросы, Circuit Breaker предотвращает перегрузку, а Fallback возвращает запасной результат. Эти подходы повышают устойчивость системы.
Недоступность внешнего сервиса — частая проблема в микросервисах. Для её обработки применяют несколько подходов, чтобы минимизировать сбои.
1. Таймауты:
Описание: Ограничение времени ожидания ответа сервиса.
Реализация: Настройка в HTTP-клиентах (например, WebClient).
Пример:
WebClient client = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(HttpClient.create().responseTimeout(Duration.ofSeconds(2))))
.build();Применение: Защищает от зависаний при недоступности сервиса.
2. Ретраи (Retries):
Описание: Повтор запроса при временных сбоях.
Реализация: Использование библиотек, таких как Resilience4j.
Пример:
RetryConfig config = RetryConfig.custom().maxAttempts(3).waitDuration(Duration.ofMillis(500)).build();
Retry retry = Retry.of("retry", config);
Supplier<String> supplier = Retry.decorateSupplier(retry, () -> callService());Ограничения: Применяется только для временных ошибок (например, 503).
3. Circuit Breaker:
Описание: Прерывает запросы к недоступному сервису, чтобы избежать перегрузки.
Реализация: Resilience4j или Hystrix.
Пример:
CircuitBreaker breaker = CircuitBreaker.ofDefaults("service");
String result = breaker.executeSupplier(() -> callService());Применение: Защищает систему при длительной недоступности сервиса.
4. Fallback:
Описание: Возвращает запасной результат при сбое.
Пример:
try {
return webClient.get().uri("http://service/data").retrieve().bodyToMono(String.class).block();
} catch (WebClientResponseException e) {
return "Запасной результат";
}Применение: Для обеспечения работы при сбоях (например, возврат кэшированных данных).
Когда использовать:
Таймауты — для всех внешних вызовов.
Ретраи — для временных сбоев.
Circuit Breaker — для защиты от длительных сбоев.
Fallback — для сохранения функциональности.
Вывод:
Комбинация таймаутов, ретраев, Circuit Breaker и Fallback повышает устойчивость микросервисов к сбоям внешних сервисов, обеспечивая стабильность приложения.