IPC — межпроцессовое взаимодействие в Node.js

Общение между процессами: stdin/stdout, сокеты, message-канал в child_process.fork/cluster, разделяемые файлы.

Что это

IPC (Inter-Process Communication) — способы передать данные между процессами. В Node.js используется при горизонтальном масштабировании (cluster), распараллеливании задач (fork), интеграции с внешними программами.

Способы IPC

Способ Транспорт Кейс
stdin/stdout пайпы child запущен через spawn, родитель пишет в stdin
Файлы (mmap) диск/память большие объёмы данных между процессами
Сокеты (TCP/Unix) сеть/IPC универсальный, прозрачно масштабируется на разные машины
Message channel IPC pipe fork и cluster — встроенный send/on('message')
Shared memory RAM worker_threads + SharedArrayBuffer (не между процессами)
Memory Mapped Files mmap редко в ноде; нужна нативная привязка

API / Пример (fork)

// master.js
const { fork } = require('child_process');
const worker = fork('./worker.js');
worker.send({ command: 'compute', data: [1, 2, 3] });
worker.on('message', (msg) => console.log('result:', msg.result));

// worker.js
process.on('message', (msg) => {
  if (msg.command === 'compute') {
    const result = msg.data.map((x) => x * 2);
    process.send({ result });
  }
});

Уровни связанности процессов

  1. Полностью независимые — нет общих данных, лучшее для масштабирования.
  2. С общим состоянием через IPC — обмен сообщениями, сериализация при каждой передаче.
  3. С разделяемой памятью — самое опасное, нужна синхронизация (mutex, semaphore).

Производительность / Подводные камни

  • send сериализует объект в JSON — большие данные = большие накладные. Для биг-дата лучше Stream через socket.
  • Сокеты прозрачно масштабируются — тот же код работает между процессами и между серверами.
  • Общие файлы — самое опасное — нужны контрольные суммы, локи, согласованный протокол доступа.
  • console.log синхронный — несколько процессов пишут вперемешку, порядок не гарантирован.
  • cluster передаёт хендлы сокетов через свой IPC — это позволяет нескольким процессам слушать один порт.
  • Сборка результатов по порядку — параллельные воркеры завершаются в произвольном порядке; нужен process ID или task ID.

🎓 Источники

  • 🎓 Межпроцессовое взаимодействие в Node.js · 2018-10-16
    • Тезисы: три уровня связанности (независимые / IPC / shared memory); транспорты — pipes, файлы, сокеты, message channel; TCP прозрачно масштабируется на сеть; worker.send(obj) сериализует JSON; маршрутизация задач по message.command; cluster — обёртка над child_process, умеет передавать хендлы.
    • Цитата: «Воркеры, которые порождаются кластером, имеют ту же самую структуру — экземпляры того же класса, что и child process.»

См. также