Как параллельные запросы обрабатываются Nodejs express http server? - PullRequest
1 голос
/ 08 июля 2019

Я создаю приложение Node.js и хотел понять, как обрабатываются параллельные запросы.

Я создаю тестовый сервер, где высокая нагрузка на ЦПУ моделируется ожиданием 10 секунд. Чтобы проверить поведение, я открываю две вкладки браузера и одновременно обновляю страницу.

const http      = require('http');
const express       = require('express');
const bodyParser        = require('body-parser');
const app       = express();
const server        = require('http').createServer(app);  

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.get('*', function (req, res, next) {
    var requestTime = new Date().getTime(),
            executionTime;

    doHeavyWork(requestTime, function(error){
        res.send({
            requestTime     : requestTime,
            executionTime   :   executionTime
        });
    });

});

function doHeavyWork (requestTime, callback) {
    var sleepSeconds = 10;

    while (requestTime + sleepSeconds*1000 >= new Date().getTime()) {}

    callback(null);
}

server.listen(1337, '127.0.0.1');

Из того, что я слышал о Node.js, я ожидал, что обе вкладки завершат загрузку в одно и то же время. В действительности вкладка, которая обновляется первой, также заканчивается первой. Следующая вкладка загружается через дополнительные 10 секунд. Таким образом, сервер обрабатывает запросы по одному, а не обрабатывает их одновременно. Что мне здесь не хватает?

1 Ответ

1 голос
/ 08 июля 2019

Чтобы ответить на ваш вопрос, не вдаваясь в мельчайшие подробности того, как работает Node (который я советую вам прочитать), вы увидите именно то поведение, которое я ожидал бы увидеть на основе вашего кода.

Для каждого работающего экземпляра узла существует отдельный поток обработки, в сценариях большого объема рекомендуется выполнять как можно меньше операций с привязкой к ЦП, чтобы не блокировать этот поток.В вашем примере каждый запрос выполняет операцию с привязкой к процессору в течение 10 с, что означает, что Node не может обрабатывать новые запросы до тех пор, пока этот запрос не завершится.

Если вы хотите лучше продемонстрировать пропускную способность Node, используйте непример блокировки, например, использование таймера

app.get('*', function (req, res, next) {
  var requestTime = new Date().getTime(),
        executionTime;

  setTimeout(() => {
    res.send({
      requestTime,
      executionTime
    });
  }, 10000);
});
...