Worker Threads
Тема дорожной карты · Node.js
Worker threads (рабочие потоки) — это функция Node.js, появившаяся в Node.js 12 (стабилизированная в v12 LTS) через встроенный модуль worker_threads, позволяющая запускать JavaScript параллельно на нескольких ядрах CPU и решающая проблему неспособности однопоточного цикла событий выполнять ресурсоёмкие вычисления без блокировки I/O. Рабочий поток выполняется в собственном экземпляре V8 и цикле событий, совместно использует память ArrayBuffer и SharedArrayBuffer с главным потоком для обмена данными без копирования и взаимодействует через MessageChannel — вызывая parentPort.postMessage() и прослушивая workerData, — что делает модель конкурентности Node.js явной и безопасной. Worker threads — правильный инструмент для CPU-интенсивных рабочих нагрузок в серверной разработке Node.js, таких как обработка изображений, криптографические операции, JSON-парсинг очень больших полезных нагрузок и машинное обучение, тогда как конкурентность I/O-операций по-прежнему должна опираться на неблокирующую модель цикла событий. Модуль worker_threads отличается от модуля cluster — кластеры разветвляют весь процесс Node.js, тогда как рабочие потоки являются более лёгкими потоками внутри одного процесса, совместно использующими память, а не дублирующими кучу процесса. TypeScript-разработчики могут использовать worker threads, предварительно скомпилировав TypeScript в JavaScript или применив tsx с типизацией workerData через обобщения, что обеспечивает типобезопасное межпоточное взаимодействие в производительно-критичных серверных сервисах Node.js.
Как это работает
Worker Threads масштабирует 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-процесс на контейнер, оркестратор задаёт количество.
Типичные ошибки
Ловушки Worker Threads: расчёт, что workers делят память (нет — Redis для общего state); неверная sticky session за балансировщиком (WebSocket-клиенты прыгают между workers, теряют state); PM2 внутри контейнеров (двойная оркестрация); нет graceful SIGTERM (in-flight запросы дропаются на rolling restart). Drain соединений на shutdown.