Проверка состояния сервисов в Node.js: зачем нужны health checks и как их реализовать

9 минут чтения
Средний рейтинг статьи — 4.7

В мире микросервисов и распределённых систем наличие стабильного механизма проверки доступности сервисов критически важно. Health checks позволяют определить, работает ли сервис корректно и готов ли он обрабатывать запросы. В этой статье мы рассмотрим, как реализовать health checks в Node.js-приложении, какие типы проверок бывают, зачем они нужны и как их правильно интегрировать в инфраструктуру.

Зачем нужны health checks?

Health checks позволяют:

  • определить, работает ли сервис на базовом уровне (например, процесс не упал);
  • понять, подключен ли сервис к базам данных и другим зависимостям;
  • информировать оркестраторы (например, Kubernetes) о готовности и «живости» приложения;
  • своевременно реагировать на деградации и инциденты.

Виды health checks

В Node.js обычно реализуются следующие типы проверок:

1. Liveness check

Проверка того, жив ли процесс Node.js. Используется, чтобы перезапустить контейнер или сервис при зависании.

2. Readiness check

Проверка, готов ли сервис принимать трафик. Например, приложение может быть запущено, но ещё не подключено к базе данных.

3. Startup check

(Особенно актуален в Kubernetes) — позволяет убедиться, что приложение полностью инициализировано перед запуском других компонентов.

Пример реализации health checks в Express

import express from 'express';
import mongoose from 'mongoose';
 
const app = express();
 
let isDbConnected = false;
 
mongoose.connect('mongodb://localhost:27017/myapp')
  .then(() => {
    isDbConnected = true;
    console.log('Connected to DB');
  })
  .catch(() => {
    isDbConnected = false;
  });
 
app.get('/health/liveness', (_, res) => {
  res.status(200).send('OK');
});
 
app.get('/health/readiness', (_, res) => {
  if (isDbConnected) {
    res.status(200).send('READY');
  } else {
    res.status(500).send('NOT READY');
  }
});
 
app.listen(3000, () => console.log('Server running on port 3000'));

В приведённом выше примере реализованы два endpoint'а для health checks: /health/liveness и /health/readiness. Давайте разберёмся, что делает каждый из них и зачем они нужны.

/health/liveness

Этот endpoint отвечает на вопрос: «Жив ли процесс Node.js?» Он не проверяет подключения к базам данных или другим внешним сервисам — только факт, что процесс не завис и продолжает обрабатывать HTTP-запросы.

/health/readiness

Этот endpoint отвечает на вопрос: «Готово ли приложение принимать трафик?» Он проверяет критичные зависимости, в данном случае — подключение к базе данных MongoDB. Если база не подключена — сервис возвращает 500 и Kubernetes не будет направлять на него трафик.

Интеграция с Kubernetes

Kubernetes поддерживает три вида probes:

  • livenessProbe
  • readinessProbe
  • startupProbe

Пример конфигурации для 2 проб:

livenessProbe:
  httpGet:
    path: /health/liveness
    port: 3000
  initialDelaySeconds: 10
  periodSeconds: 5
 
readinessProbe:
  httpGet:
    path: /health/readiness
    port: 3000
  initialDelaySeconds: 5
  periodSeconds: 5

startupProbe особенно полезен для приложений с длительной инициализацией — он позволяет задать длительный тайм-аут на запуск без преждевременного перезапуска контейнера. Пока startupProbe не вернёт успешный ответ, livenessProbe и readinessProbe не будут активны. Это помогает избежать ситуаций, когда приложение ещё не готово, но Kubernetes уже считает его нестабильным.

Библиотеки и инструменты

Для более продвинутых сценариев можно использовать:

Практические советы

  • Не сводите проверку к «если процесс работает — значит всё хорошо». Проверяйте зависимости.
  • Изолируйте логику health checks в отдельные модули.
  • Настройте alert-правила, чтобы реагировать на отклонения.
  • Учитывайте время инициализации (например, база может подниматься дольше, чем само приложение).

Выводы

Health checks в Node.js — это не просто «endpoint /health», а важный инструмент надёжности. Они помогают понять, что сервис действительно функционирует корректно, и позволяют платформам вроде Kubernetes грамотно управлять жизненным циклом приложения. Используя readiness, liveness и startup проверки, вы повышаете устойчивость своего Node.js-приложения и минимизируете время простоя.

Если вы ещё не внедрили health checks в ваше приложение — начните с базовой реализации, протестируйте в staging-среде и постепенно расширяйте логику проверок.

9 минут чтения
Средний рейтинг статьи — 4.7

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний