Nodejs处理的并发请求如何表达http服务器?

时间:2019-07-08 18:58:37

标签: node.js express nodejs-server

我正在构建Node.js应用程序,并想了解如何处理并发请求。

我构建了一个测试服务器,其中等待10秒钟来模拟高CPU负载。为了测试行为,我打开了两个浏览器选项卡并同时刷新页面。

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 个答案:

答案 0 :(得分:1)

要回答您的问题而无需深入研究nitty gritty Node的工作方式(我建议您阅读),根据您的代码,您所看到的行为正是我所希望看到的。

对于每个正在运行的Node实例,只有一个处理线程,在高容量方案中,建议尽可能少地执行CPU绑定操作,以免阻塞该线程。在您的示例中,每个请求都运行10秒钟的CPU约束操作,这意味着Node在该请求完成之前无法处理任何新请求。

如果您想更好地演示Node的吞吐量,请使用非阻塞示例,例如使用计时器

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

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