Этот вопрос проверяет понимание ограничений однопоточного event loop в Node.js и помогает оценить способность разработчика проектировать масштабируемые асинхронные приложения.
Event loop в Node.js — это механизм, который обрабатывает асинхронные операции в одном потоке. Он эффективен для I/O-задач, но имеет ограничения при выполнении большого количества синхронных или вычислительно сложных задач.
Рассмотрим сервер, который выполняет тяжёлое вычисление синхронно в обработчике запроса:
const http = require('http');
// Функция, блокирующая event loop (имитация тяжёлой задачи)
function blockingTask(durationMs) {
const start = Date.now();
while (Date.now() - start < durationMs) { /* busy wait */ }
}
const server = http.createServer((req, res) => {
if (req.url === '/compute') {
// Эта операция заблокирует цикл на 3 секунды!
blockingTask(3000);
res.end('Computation done');
} else {
res.end('Hello');
}
});
server.listen(3000);
console.log('Server running on port 3000');Пока сервер обрабатывает запрос /compute, все остальные запросы (даже на /) будут ждать 3 секунды. Это делает сервер непригодным для продакшена.
setImmediate() или process.nextTick(), чтобы давать циклу событий возможность обрабатывать другие задачи между частями.node --inspect или библиотеки (например, clinic.js) для выявления блокировок.Вывод: Проблемы с большим количеством задач в event loop возникают из-за его однопоточной природы. Ключевое решение — не блокировать цикл долгими операциями, вынося их за его пределы (в потоки/процессы) и строго следуя асинхронным паттернам. Это критически важно для создания отзывчивых и масштабируемых приложений на Node.js.