我想我刚刚发现了一些与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/时,第一个标签必须在node.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.17 和 v0.8.21
进行测试答案 0 :(得分:12)
浏览器实现每个域名的并发连接限制。剪断:
浏览器通常会限制每个并发HTTP连接的数量 服务器为2(术语“每服务器”在这里广泛使用 简单。例如,它可以是多个物理机器 共享相同的公共IP。)。如果浏览器会话有两个HTTP 连接已经,任何进一步的连接请求将不得不等待 直到这两个HTTP连接中的一个完成。结果, 浏览器(或应用程序)似乎被锁定。虽然是“两个 连接限制“几年前有道理,这是非常有问题的 今天的Ajax启用了“web 2.0”应用程序。
来源:http://www.openajax.org/runtime/wiki/The_Two_HTTP_Connection_Limit_Issue
节点未阻止,您的浏览器是。我建议使用apache基准测试(ab -c 10 -n 10)进行测试。
答案 1 :(得分:4)
是的,你错过了什么
您应该尝试使用除了完整的Web浏览器之外的其他内容来测试您的服务器。例如,尝试curl
。
Chrome做了许多其他事情,而不是做你告诉它做的事情。