我正在尝试理解nodejs在负载下处理大量内容时的局限性。具体地说,我想知道发送给客户端的冗长响应是否会阻塞。
我已经创建了一个非常简单的测试设置,node仅使用从1 1GB http下载中提取的流来响应每个请求。下面是我的代码:
var http = require('http');
var fs = require('fs');
var iterator = 0;
http.createServer(function(req, res) {
console.log('req received ', iterator++);
var url = 'http://download.thinkbroadband.com/1GB.zip';
http.get(url, bigFile => {
res.writeHead(200, {
'content-type': 'application/zip',
'content-length': bigFile.headers['content-length'],
});
bigFile.pipe(res);
});
}).listen(8003);
因此,我启动了这个节点服务器,并使用浏览器中的几个选项卡访问端点。有趣的是,后续响应不会立即记录到console.log('request received ', iterator++);
代码中。相反,在记录初始事件之前会有5到10秒的延迟。
这对我来说很奇怪,因为如果http响应流被阻塞,那么它应该等到第一个请求完成后才接受第二个请求。如果流没有阻塞,那么我希望在请求之后立即看到所有请求被记录下来。
有人能解释一下吗?
我也很乐意在这里听到关于性能的任何想法。Node可能并不是真正为这种事情而构建的。在多个请求的情况下,下载速度确实会受到影响。
发布于 2017-03-01 05:55:08
经过更多的研究,我可以看到事件循环的不同阶段如何导致我看到的结果。节点guides解释了执行所有I/O事件的轮询阶段如何在需要时阻塞,并且它还具有最大堆栈,因此它不会完全阻塞主线程太长时间。
这将解释我所看到的具有大量I/O事件(即使我没有使用on('data')...
监听它们的目录)可能会暂时阻塞节点应用程序的行为。我看到在第一个请求之后大约有5到10秒的延迟,然后其他请求才能通过。
当然,还可以做其他事情来提高性能,比如使用Cluster模块来使用机器上所有可用的处理器。然而,归根结底,node可能不是最好的解决方案。你会从一个传统的web服务器上获得更好的性能,它包含了你需要的所有线程。即使在使用了所有处理器之后,我也只将节点的CPU利用率提高了大约6%。
https://stackoverflow.com/questions/42500340
复制相似问题