1

我想我刚刚发现 node.js 或浏览器有些奇怪。所以 node.js 应该是非阻塞的,但是一个简单的 setTimeout 会为同一个客户端阻塞整个网站。

这是服务器代码:

// Create HTTP Server
var http = require('http');

// Create page number holder
var page = 0;

http.createServer(function (req, res) {
    // Increment Page Number
    page++; 

    // Log page load
    console.log('LOAD PAGE', page); 

    // Set response header
    res.writeHead(200, {'Content-Type': 'text/plain'}); 

    // Wait 10 seconds and write Hello World message to client.
    setTimeout(function(){ res.end('Hello World\n'); }, 10000); 

}).listen(5000); // Listen on port 5000

// Log server start
console.log('Server running on port 5000.');

所以我要说的是,当我尝试用两个选项卡在 Chrome(版本 25.0.1364.152)中打开http://mysite.com:5000/时,第一个选项卡必须在节点处理第二个选项卡之前完成.js。

它看起来像这样:

Client: Open Tab1 
> server console: LOAD PAGE 1

Client: Open Tab2
> server console: Nothing happens

Server: Wait 10 seconds
> server console: LOAD PAGE 2

我希望 node.js 立即运行这两个请求,否则这不是非阻塞的。我已经用 Firefox 19 对此进行了测试,因此浏览器的行为似乎与此相同。

那么发生了什么?我错过了什么吗?:OOOO

更新

我只是在 Safari(6.0.2) 中运行测试并且它工作正常,所以这可能是 Chrome 和 Firefox 以及其他浏览器的问题。

使用 Node.js 版本v0.6.17v0.8.21测试

4

2 回答 2

12

浏览器实现每个域名的并发连接限制。剪辑:

浏览器通常将每台服务器的并发 HTTP 连接数限制为 2(为简单起见,此处广泛使用术语“每台服务器”。例如,它可能是共享同一公共 IP 的多台物理机。)。如果浏览器会话已经有两个 HTTP 连接,任何进一步的连接请求都必须等到这两个 HTTP 连接之一完成。结果,浏览器(或应用程序)似乎被锁定。虽然“两个连接限制”几年前是有道理的,但在今天启用 Ajax 的“web 2.0”应用程序中是非常有问题的。

来源:http ://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue

节点没有阻塞,你的浏览器是。我推荐 apache benchmark (ab -c 10 -n 10) 进行测试。

于 2013-03-05T17:14:03.210 回答
4

是的,你错过了一些东西 你应该尝试用其他东西而不是成熟的网络浏览器来测试你的服务器。curl例如尝试。

Chrome 会做很多其他事情,而不是按照您的要求去做。

于 2013-03-05T17:06:31.817 回答