Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: timeout, retry, circuit breaker, fallback, microservices

Какие подходы используются для обработки ошибок при недоступности внешнего сервиса?

Вопрос проверяет знание методов обработки сбоев внешних сервисов в микросервисной архитектуре.

Короткий ответ

Для обработки недоступности внешнего сервиса используют таймауты, ретраи, 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 повышает устойчивость микросервисов к сбоям внешних сервисов, обеспечивая стабильность приложения.

Уровень

  • Рейтинг:

    2

  • Сложность:

    7

Навыки

  • Java

    Java

Ключевые слова

#timeout

#retry

#circuit breaker

#fallback

#microservices

Подпишись на Java Developer в телеграм