Выбор ответа Senior Кластер, воркеры, масштабирование обновлено

worker_threads или cluster для CPU-задачи

Вопрос

В сервисе одна тяжёлая операция: генерация PDF-отчёта на 2 секунды CPU. Остальные эндпоинты лёгкие. Что разумнее?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Пул workerthreads (piscina) или отдельный сервис с очередью. Cluster добавляет процессы, но каждый из них по-прежнему блокируется на 2 секунды при генерации: лёгкие запросы, попавшие в этот процесс, ждут.

Варианты ответа

  1. Запустить cluster на все ядра, так отчёт перестанет блокировать
  2. Сделать функцию генерации async, и она уйдёт с основного потока
  3. Увеличить UV_THREADPOOL_SIZE, чтобы PDF считался в пуле libuv
  4. Пул worker_threads (piscina) или отдельный сервис с очередьюправильный ответ

Разбор

Cluster добавляет процессы, но каждый из них по-прежнему блокируется на 2 секунды при генерации: лёгкие запросы, попавшие в этот процесс, ждут. Пул воркеров выносит CPU из основного потока: event loop свободен, а число одновременных генераций ограничено размером пула. При большой нагрузке генерацию лучше вынести в отдельный сервис с очередью, чтобы масштабировать её независимо.

async не делает синхронный код параллельным. UV_THREADPOOL_SIZE влияет только на операции libuv (fs, crypto, zlib, dns.lookup), а не на ваш JS.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме