IPC и сообщения
Тема дорожной карты · Node.js
Передача сообщений в Node.js — это основной способ взаимодействия между отдельными процессами — такими как созданные модулем cluster или child_process.fork() — без совместного использования памяти. Каждый дочерний процесс получает IPC-канал (межпроцессное взаимодействие), через который может вызвать process.send() для передачи JavaScript-объекта родительскому процессу, а родитель может ответить через метод send() объекта дочернего процесса. Модель передачи сообщений обеспечивает изоляцию процессов Node.js, что повышает стабильность: аварийное завершение одного рабочего не повреждает общее состояние. В серверных архитектурах на основе Express.js, использующих несколько рабочих процессов, передача сообщений часто применяется для рассылки инвалидаций кэша, координации состояния ограничения частоты запросов или распространения изменений конфигурации во время выполнения. Понимание передачи сообщений является ключевым элементом построения масштабируемых многопроцессных серверных приложений Node.js на JavaScript.
Как это работает
IPC и сообщения масштабирует Node за одно ядро. Модуль cluster форкает worker-процессы, делящие порт сервера. PM2 оборачивает cluster + добавляет рестарт на crash, управление логами, zero-downtime reload. Контейнеры + оркестратор (Kubernetes, Nomad, Docker Compose с replicas) — современная альтернатива: один процесс на контейнер, масштаб по количеству контейнеров. Перед ними всегда load balancer (nginx, caddy, traefik).
Когда применять
cluster/PM2 — для single-host bare-metal или VM. Контейнеры + оркестратор — для multi-host production: та же модель масштабирования, лучше тулинг. Старый совет "один worker на CPU-ядро" работает; с контейнерами — один Node-процесс на контейнер, оркестратор задаёт количество.
Типичные ошибки
Ловушки IPC и сообщения: расчёт, что workers делят память (нет — Redis для общего state); неверная sticky session за балансировщиком (WebSocket-клиенты прыгают между workers, теряют state); PM2 внутри контейнеров (двойная оркестрация); нет graceful SIGTERM (in-flight запросы дропаются на rolling restart). Drain соединений на shutdown.