Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Node.js: REST API, error handling, HTTP status codes, retry logic, circuit breaker

Как обрабатывать ошибки при REST-вызовах между сервисами?

Вопрос проверяет понимание стратегий обработки ошибок в распределённых системах, что необходимо для создания отказоустойчивых и предсказуемых микросервисов.

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

Ошибки при REST-вызовах обрабатываются на нескольких уровнях. Во-первых, используйте стандартные HTTP-статусы (4xx для клиентских ошибок, 5xx для серверных). Во-вторых, возвращайте в теле ответа структурированную информацию об ошибке (код, сообщение, детали). На стороне клиента реализуйте логику повторных попыток для временных сбоев и паттерн "Circuit Breaker" для защиты от сбоев в зависимых сервисах. Это делает систему устойчивой к временным неполадкам.

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

Обработка ошибок в REST-вызовах между сервисами — это критически важная часть проектирования распределённых систем. Без чёткой стратегии временные сбои сети или зависания сервисов могут привести к каскадным отказам и непредсказуемому поведению приложения.

Использование HTTP-статусов и структуры ошибок

Сервер должен возвращать осмысленные HTTP-статусы. Например, 400 для некорректного запроса, 404 если ресурс не найден, 429 при превышении лимита запросов, 500 для внутренней ошибки сервера и 503 если сервис временно недоступен. В теле ответа следует возвращать JSON с деталями ошибки, чтобы клиент мог её корректно обработать.

// Пример ответа с ошибкой от сервера
HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Email format is invalid",
    "details": {"field": "email"}
  }
}

Стратегии на стороне клиента (вызывающего сервиса)

Клиентский код не должен просто падать при получении ошибки. Необходимо реализовать следующие механизмы:

  • Повторные попытки (Retry): Для временных ошибок (статусы 5xx, 429, таймауты сети) можно выполнить несколько попыток с экспоненциальной задержкой.
  • Аварийный выключатель (Circuit Breaker): Этот паттерн отслеживает количество неудачных вызовов. При превышении порога он "разрывает цепь" и сразу возвращает ошибку, не делая реальный запрос, давая зависимому сервису время на восстановление.
  • Резервный ответ (Fallback): В случае неудачи можно вернуть кэшированные данные или значение по умолчанию, чтобы основная функциональность приложения оставалась доступной.
// Псевдокод логики повторных попыток с экспоненциальной задержкой
async function fetchWithRetry(url, maxRetries = 3) {
  let lastError;
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await makeHttpRequest(url);
    } catch (error) {
      lastError = error;
      // Повторяем только для определённых ошибок
      if (!isRetryableError(error)) break;
      // Ждём перед следующей попыткой
      await delay(1000 * Math.pow(2, i));
    }
  }
  throw lastError;
}

Мониторинг и логирование

Все ошибки должны логироваться с достаточным контекстом (ID запроса, endpoint, код ошибки). Это необходимо для оперативного анализа инцидентов. Также настройте алертинг на рост частоты ошибок определённого типа.

Вывод: Грамотная обработка ошибок REST-вызовов необходима для построения отказоустойчивых микросервисных архитектур. Используйте стандартные HTTP-статусы, структурированные тела ошибок, реализуйте на клиенте retry и circuit breaker, а также обеспечьте качественное логирование. Это особенно важно в продакшн-среде, где сбои неизбежны.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Node.js

    Node.js

  • Networks

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

#REST API

#error handling

#HTTP status codes

#retry logic

#circuit breaker

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