流式传输HTTP响应块nodejs



我正在尝试了解nodejs的限制。具体来说,我想知道向客户端冗长的响应是否会阻止。

我已经创建了一个非常简单的测试设置,其中节点只需从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响应正在阻止,则应该等到第一个请求完成后才接受第二请求。如果流媒体没有阻塞,那么我希望在请求后立即看到所有请求。

有人可以解释一下吗?

我也很想在这里听到有关表演的任何想法。节点可能并不是真正用于这种事情的。下载速度确实有多个请求。

在进行了更多研究之后,我可以看到事件循环的不同阶段如何导致我看到的结果。节点指南解释了如何执行所有I/O事件的轮询阶段,如果需要,它也具有最大堆栈,因此它不会完全阻止主线程太长。

这将解释我看到的行为有很多I/O事件(即使我不使用on('data')...听取它们的目录)可以暂时阻止您的节点应用程序。在第一个请求之后,我看到了大约5到10秒的延迟。

当然可以做其他事情来提高性能,例如使用群集模块使用机器上的所有可用处理器。但是,归根结底,节点可能不是这里最好的解决方案。带有所需的所有线程,您可以从传统的Web服务器中获得更好的性能。即使使用了所有处理器,我也只用节点推动了约6%的CPU利用率。

最新更新