Как не блокировать Event Loop в Node.js?
Производительность и production
Event Loop блокируется, когда синхронный код выполняется долго: пока он работает, сервер не обрабатывает остальные запросы.
Типичные причины
- Большие циклы и вложенные вычисления в обработчике запроса.
JSON.parseилиJSON.stringifyогромных объектов.- Синхронные API:
fs.readFileSync,crypto.pbkdf2Sync. - Катастрофическое backtracking в регулярных выражениях.
Что делать
- Использовать асинхронные версии функций и потоки.
- Тяжёлые вычисления выносить в
worker_threadsили в отдельный сервис. - Большие списки обрабатывать порциями, отдавая управление через
setImmediate. - Измерять задержку цикла:
perf_hooks.monitorEventLoopDelay().
import { monitorEventLoopDelay } from 'node:perf_hooks';
const h = monitorEventLoopDelay({ resolution: 20 });
h.enable();
setInterval(() => console.log('p99 ms:', h.percentile(99) / 1e6), 5000);Коротко для собеседования
Любая синхронная работа дольше нескольких миллисекунд мешает всем клиентам. Делаем её асинхронной, выносим в воркер или режем на части и следим за задержкой цикла.