Event loop в Node.js и libuv

↑ 6.1 Node.js изнутри · → Следующая

По желанию~3 мин чтенияУровень: junior

Зачем это на собесе

Главный вопрос по Node.js: почему один поток обслуживает тысячи запросов и что блокирует event loop.

Объяснение

Node.js выполняет JavaScript в одном главном потоке. Ввод-вывод делегируется операционной системе и пулу потоков libuv, а результат возвращается в главный поток через очереди событий.

Фазы цикла (упрощённо):

ФазаЧто выполняется
timersколбэки setTimeout, setInterval
pending callbacksотложенные системные колбэки
pollновые события ввода-вывода, выполнение их колбэков
checkколбэки setImmediate
close callbacksзакрытие сокетов и дескрипторов

Между колбэками выполняются микрозадачи: сначала process.nextTick, затем очередь промисов (then, await).

console.log("1 sync");
setTimeout(() => console.log("4 timeout"), 0);
setImmediate(() => console.log("5 immediate"));
Promise.resolve().then(() => console.log("3 promise"));
process.nextTick(() => console.log("2 nextTick"));
// порядок: 1, 2, 3, затем 4/5 (порядок timeout и immediate в главном модуле не гарантирован)

Пул потоков libuv (по умолчанию 4, UV_THREADPOOL_SIZE) обслуживает операции без асинхронного API в ОС: файловая система, DNS-lookup, часть криптографии, zlib. Сетевой ввод-вывод идёт через epoll/kqueue/IOCP без потоков.

Нюансы и подводные камни

  • Тяжёлое вычисление в JS-коде блокирует весь процесс: все запросы ждут (JSON.parse огромного тела, crypto.pbkdf2Sync, цикл на миллиард итераций).
  • Синхронные API (fs.readFileSync) допустимы только при старте.
  • Бесконечная рекурсия process.nextTick «голодит» ввод-вывод.
  • Node.js масштабируют процессами (cluster, контейнеры) и worker threads (см. Worker threads и cluster).
  • Нагрузка измеряется задержкой event loop (perf_hooks.monitorEventLoopDelay).

Практика

  1. Заблокируйте event loop циклом и измерьте задержку ответа другого эндпоинта.
  2. Предскажите порядок вывода для смеси setTimeout, setImmediate, промисов и nextTick.
  3. Замерьте влияние UV_THREADPOOL_SIZE на параллельное хэширование.

Вопросы с ответами

Связанные темы