worker_threads или cluster для CPU-задачи
Вопрос
В сервисе одна тяжёлая операция: генерация PDF-отчёта на 2 секунды CPU. Остальные эндпоинты лёгкие. Что разумнее?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Запустить cluster на все ядра, так отчёт перестанет блокировать
- Сделать функцию генерации
async, и она уйдёт с основного потока - Увеличить
UV_THREADPOOL_SIZE, чтобы PDF считался в пуле libuv - Пул
worker_threads(piscina) или отдельный сервис с очередьюправильный ответ
Разбор
Cluster добавляет процессы, но каждый из них по-прежнему блокируется на 2 секунды при генерации: лёгкие запросы, попавшие в этот процесс, ждут. Пул воркеров выносит CPU из основного потока: event loop свободен, а число одновременных генераций ограничено размером пула. При большой нагрузке генерацию лучше вынести в отдельный сервис с очередью, чтобы масштабировать её независимо.
async не делает синхронный код параллельным. UV_THREADPOOL_SIZE влияет только на операции libuv (fs, crypto, zlib, dns.lookup), а не на ваш JS.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Кластер, воркеры, масштабирование»
- Консистентное хеширование с виртуальными узлами
- Балансировка least connections
- Плавный взвешенный round-robin как в nginx
- Код-ревью: сервис перед масштабированием в 4 инстанса
- Модуль cluster
- cluster внутри Kubernetes
- Память у воркеров cluster
- cluster или worker_threads