Worker threads и cluster
↑ 6.1 Node.js изнутри · ← Предыдущая
Зачем это на собесе
Как использовать несколько ядер в Node.js и как выполнять тяжёлые вычисления.
Объяснение
| Механизм | Что это | Для чего |
|---|---|---|
cluster | несколько процессов Node.js на одном порту | масштабирование HTTP-сервера по ядрам |
worker_threads | потоки со своим event loop и памятью V8 | CPU-bound вычисления, не блокирующие главный поток |
child_process | запуск внешних процессов | вызов утилит |
| Контейнеры/процесс-менеджеры (PM2, Kubernetes) | несколько реплик | предпочтительный способ масштабирования |
// main.js
import { Worker } from "node:worker_threads";
const run = (n) => new Promise((resolve, reject) => {
const w = new Worker(new URL("./fib.js", import.meta.url), { workerData: n });
w.once("message", resolve); w.once("error", reject);
});
console.log(await run(42));
// fib.js
import { parentPort, workerData } from "node:worker_threads";
const fib = (n) => (n < 2 ? n : fib(n - 1) + fib(n - 2));
parentPort.postMessage(fib(workerData));Данные между потоками копируются (structured clone), либо передаются без копирования через transfer и SharedArrayBuffer + Atomics.
Нюансы и подводные камни
- Создание воркера дорого: используйте пул (Piscina).
- Worker threads не ускоряют I/O-bound задачи.
- Общее состояние приложения в cluster не разделяется: сессии и кэш храните во внешнем хранилище.
- Состояние гонки возможно только при
SharedArrayBuffer. - В контейнерах обычно проще запускать по одному процессу на контейнер и масштабировать репликами.
Практика
- Вынесите тяжёлое вычисление в worker и сравните задержку API.
- Настройте пул воркеров через Piscina.
- Запустите приложение в cluster и проверьте распределение запросов.
Вопросы с ответами
Cluster или worker threads?
Cluster — несколько процессов для масштабирования сервера; worker threads — потоки для тяжёлых вычислений внутри процесса.
Помогут ли worker threads при медленной БД?
Нет: это I/O-bound, помогает асинхронность.