Що таке IPC (inter-process communication)?
Що таке IPC
IPC (Inter-Process Communication) - це механізм, який дозволяє процесам обмінюватися даними між собою.
Простіше кажучи:
якщо в тебе є два (чи більше) процеси, IPC дає їм "канал зв'язку", щоб вони могли надсилати й отримувати повідомлення (наче "розмовляють" через провід).
1. Навіщо потрібен IPC
Кожен процес:
- працює у своєму адресному просторі (своя пам'ять, своє середовище),
- ізольований від інших (з міркувань безпеки).
Тому вони не можуть напряму ділити змінні чи пам'ять. Щоб взаємодіяти - потрібен канал зв'язку.
IPC вирішує це, дозволяючи:
- передавати дані (текст, JSON, буфери),
- координувати роботу (сигнали, події),
- синхронізувати стани між процесами.
2. Види IPC (у загальному сенсі, не лише в Node.js)
| Тип IPC | Опис | Приклад |
|---|---|---|
| Pipe (канал) | Послідовна передача даних (один пише, інший читає) | stdin/stdout |
| Message Passing | Передача повідомлень (об'єктів) через системні сокети чи канали | Node.js process.send() |
| Shared Memory | Спільна пам'ять для швидкого обміну | SharedArrayBuffer |
| Sockets | Універсальний мережевий обмін між процесами | TCP/UDP |
| Signals | Прості сигнали ОС (SIGINT, SIGTERM) | process.kill(pid, 'SIGINT') |
| Files / Named Pipes | Обмін через тимчасові файли / іменовані канали | UNIX socket, FIFO |
3. IPC у контексті Node.js
У Node.js IPC вбудований у модулі:
child_processcluster
Коли ти створюєш процес через:
const { fork } = require('child_process');Node.js автоматично створює IPC-канал між батьком і дочірнім процесом.
Це дозволяє:
- надсилати повідомлення (
child.send(data)); - отримувати їх (
process.on('message', handler)).
4. Приклад IPC у Node.js
main.js
const { fork } = require('child_process');
// Створюємо дочірній процес
const child = fork('worker.js');
// Надсилаємо повідомлення
child.send({ task: 'compute', number: 5 });
// Отримуємо відповідь
child.on('message', (msg) => {
console.log('Відповідь від дочірнього процесу:', msg);
});worker.js
process.on('message', (msg) => {
if (msg.task === 'compute') {
const result = msg.number ** 2;
process.send({ result });
}
});Що відбувається:
fork()створює IPC-канал між батьком і дочірнім процесом.- Батько надсилає об'єкт
{ task, number }. - Дочірній процес отримує його через
process.on('message'). - Після обробки - надсилає результат назад через
process.send().
Це і є Inter-Process Communication у дії.
5. IPC у модулі cluster
Модуль cluster теж використовує IPC під капотом:
- master ↔ worker спілкуються через той самий механізм.
- Можна передавати повідомлення вручну:
// master
worker.send({ msg: 'ping' });
// worker
process.on('message', (data) => {
console.log('Повідомлення від майстра:', data);
process.send({ reply: 'pong' });
});Отже, cluster використовує IPC для обміну службовими подіями та даними користувача.
6. Як влаштований IPC під капотом у Node.js
Node.js реалізує IPC через Unix Domain Sockets (на Linux/macOS) чи Named Pipes (на Windows).
Тобто:
між процесами створюється віртуальний сокет, через який серіалізуються й пересилаються повідомлення.
Ці повідомлення:
- серіалізуються (наприклад, у JSON чи бінарний формат),
- передаються внутрішнім каналом (pipe),
- десеріалізуються на приймальній стороні.
7. IPC і серіалізація даних
Через IPC можна передавати:
- об'єкти (
{name: 'Tim'}), - рядки, числа, буфери,
- навіть посилання на сокети чи файлові дескриптори.
Node.js автоматично серіалізує об'єкти під час передачі:
child.send({ user: 'Alice', age: 25 });Але важливо:
- не можна передавати функції чи посилання на контекст;
- дані передаються за значенням, а не за посиланням.
8. Переваги IPC
| Перевага | Опис |
|---|---|
| Двосторонній зв'язок | Батько й дочірній процес можуть обмінюватися даними |
| Безпека | Кожен процес ізольований, тільки через канал |
| Продуктивність | IPC усередині одного вузла швидший за HTTP |
| Універсальність | Працює між будь-якими Node.js процесами (fork, cluster) |
| Fault-tolerance | Помилка в одному процесі не ламає інші |
9. Недоліки IPC
| Недолік | Опис |
|---|---|
| Серіалізація/десеріалізація | Додає затримку під час передачі великих об'єктів |
| Ізоляція пам'яті | Не можна напряму ділити дані (лише через копії) |
| Складність синхронізації | За великої кількості процесів потрібно керувати чергами |
| Не для великих потоків даних | Краще використовувати сокети чи стріми |
Підсумок
| Критерій | Опис |
|---|---|
| Призначення | Зв'язок між процесами |
| Реалізація в Node.js | Через fork() і cluster |
| Напрямок | Двосторонній (parent ↔ child) |
| Тип даних | JSON, рядки, буфери |
| Під капотом | Unix Socket / Named Pipe |
| Переваги | Безпечно, ізольовано, ефективно |
| Недоліки | Не можна ділити пам'ять напряму |
Висновок:
IPC (Inter-Process Communication) - це механізм, який дозволяє процесам у Node.js (чи ОС загалом) спілкуватися й передавати дані одне одному без спільного використання пам'яті.
У Node.js IPC використовується в модулях
child_processіcluster, де процеси обмінюються повідомленнями через вбудований канал зв'язку.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.