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 });
}
});
Уровни связанности процессов
- Полностью независимые — нет общих данных, лучшее для масштабирования.
- С общим состоянием через IPC — обмен сообщениями, сериализация при каждой передаче.
- С разделяемой памятью — самое опасное, нужна синхронизация (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.»
- Тезисы: три уровня связанности (независимые / IPC / shared memory); транспорты — pipes, файлы, сокеты, message channel; TCP прозрачно масштабируется на сеть;