Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: error handling, external API, retry logic, circuit breaker, fallback

Что делать, если внешний сервис возвращает ошибки?

Этот вопрос проверяет умение разработчика обрабатывать ошибки при взаимодействии с внешними API и сервисами, что критически важно для создания устойчивых приложений.

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

При получении ошибок от внешнего сервиса нужно сначала определить их тип: временные (сетевые сбои, таймауты) или постоянные (неверные данные, недоступность). Для временных ошибок стоит реализовать повторные попытки с экспоненциальной задержкой. Если сервис недоступен долго, используйте паттерн Circuit Breaker, чтобы не перегружать его. Всегда предусматривайте запасной вариант (fallback), например, кешированные данные или упрощённую логику, чтобы основная функция приложения не ломалась.

Длинный ответ

Взаимодействие с внешними сервисами — неотъемлемая часть современных приложений, и ошибки в этом взаимодействии неизбежны. Грамотная обработка таких сбоев повышает отказоустойчивость системы и улучшает пользовательский опыт.

Классификация ошибок

Первым шагом является анализ кода и типа ошибки. Временные ошибки (например, таймауты сети, ошибки 5xx) часто можно решить повторным запросом. Постоянные ошибки (4xx, например, 404 или 400 из-за неверных входных данных) требуют исправления логики на стороне клиента.

Стратегии обработки

  • Повторные попытки (Retry): Для временных сбоев реализуйте логику повторных запросов с экспоненциальной задержкой (exponential backoff) и джиттером (jitter), чтобы избежать эффекта "толпы".
  • Аварийный выключатель (Circuit Breaker): Этот паттерн предотвращает постоянные запросы к неработающему сервису. После определённого количества неудач "выключатель" размыкается, и запросы сразу возвращают ошибку, периодически проверяя восстановление сервиса.
  • Резервный вариант (Fallback): Предоставьте альтернативный способ работы, например, показ кешированных данных, использование значений по умолчанию или переключение на другой, менее критичный сервис.

Пример кода (Node.js с экспоненциальной задержкой)

async function callWithRetry(apiCall, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await apiCall();
    } catch (error) {
      // Повторяем только для временных ошибок
      if (error.statusCode && error.statusCode >= 500 && i < maxRetries - 1) {
        const delay = Math.pow(2, i) * 1000 + Math.random() * 1000;
        await new Promise(resolve => setTimeout(resolve, delay));
        continue;
      }
      throw error; // Если ошибка постоянная или лимит попыток исчерпан
    }
  }
}

// Использование
callWithRetry(() => fetch('https://api.example.com/data'))
  .then(data => console.log(data))
  .catch(error => console.error('Final error:', error));

Вывод: Стратегия обработки ошибок внешних сервисов должна включать классификацию сбоев, механизмы повторных попыток для временных проблем и обязательные fallback-сценарии для поддержания базовой функциональности приложения при длительных отказах.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

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

#error handling

#external API

#retry logic

#circuit breaker

#fallback

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