Синхронный тяжёлый расчёт в HTTP-обработчике и параллельные запросы
В сервисе на Express есть эндпоинт:
app.get('/report', (req, res) => {
let sum = 0;
// синхронный расчёт, занимает около 2 секунд процессорного времени
for (let i = 0; i < 2e9; i++) sum += i;
res.json({ sum });
});
В этот момент в сервис приходят ещё 50 запросов на другие, лёгкие эндпоинты. Что с ними произойдёт?
- Node.js создаст отдельный поток на каждое соединение, и лёгкие эндпоинты ответят как обычно, пока идёт расчёт
- Они получат ошибку 503: Node.js отклоняет новые соединения, пока обработчик занят вычислением
- Они обработаются параллельно, так как каждый обработчик Express выполняется в своём контексте
- Все они будут ждать окончания расчёта: цикл занял единственный поток, в котором крутится event loop
