在Node.js中处理多个并行HTTP请求

And*_*rew 19 node.js

我知道Node是非阻塞的,但我只是意识到默认行为http.listen(8000)意味着所有HTTP请求都是一次一个地处理.我知道我不应该对此感到惊讶(这是端口如何工作),但它确实让我真的想知道如何编写我的代码以便我可以处理多个并行HTTP请求.

那么编写服务器的最佳方法是什么,以便它不会占用端口80并且长时间运行的响应不会导致长请求队列?

要说明问题,请尝试运行下面的代码并同时将其加载到两个浏览器选项卡中.

var http = require('http');
http.createServer(function (req, res) {
    res.setHeader('Content-Type', 'text/html; charset=utf-8');
    res.write("<p>" + new Date().toString() + ": starting response");
    setTimeout(function () {
        res.write("<p>" + new Date().toString() + ": completing response and closing connection</p>");
        res.end();
    }, 4000);
}).listen(8080);
Run Code Online (Sandbox Code Playgroud)

Pet*_*ons 14

您误解了节点的工作原理.上面的代码可以接受来自数百或数千个客户端的TCP连接,读取HTTP请求,然后等待你在那里烘焙的4000毫秒超时,然后发送响应.每个客户端将在大约4000 +几毫秒内得到响应.在该setTimeout期间(以及在任何I/O操作期间),节点可以继续处理.这包括接受其他TCP连接.我测试了你的代码,每个浏览器都得到了4s的响应.第二个不需要8s,如果这是你认为它的工作方式.

curl -s localhost:8080通过键盘尽可能快地运行4个选项卡,时间戳中的秒数为:

  1. 54至58
  2. 54至58
  3. 55至59岁
  4. 56至00

这里没有问题,虽然我可以理解你怎么认为有一个问题.如果它像你的帖子那样工作,节点将完全被破坏.

这是验证的另一种方法:

for i in 1 2 3 4 5 6 7 8 9 10; do curl -s localhost:8080 &;done                                                                                                                                                                       
Run Code Online (Sandbox Code Playgroud)

  • 你是对的.这是Chrome正在做的事情.至少对我来说,第二个请求在第一个请求返回之前不会发出. (6认同)