【问题标题】:Does streaming an http response block nodejs?流式传输http响应会阻止nodejs吗?
【发布时间】:2017-02-28 04:40:00
【问题描述】:

我试图了解 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 响应被阻塞,那么它应该等到第一个请求完成后再接受第二个请求。如果流媒体没有阻塞,那么我希望看到所有请求在被请求后立即记录。

谁能解释一下?

我也很想听听这里关于性能的任何想法。 Node 可能并不是真正为这类事情而构建的。下载速度确实受到多个请求的影响。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    经过更多研究,我可以看到事件循环的不同阶段如何导致我看到的结果。节点guides 解释了执行所有 I/O 事件的轮询阶段如何在需要时阻塞,并且它还具有最大堆栈,因此它不会完全阻塞主线程太长时间。

    这可以解释我看到的有大量 I/O 事件(即使我没有使用 on('data')... 收听它们的目录)可能会暂时阻止您的节点应用程序的行为。我看到在第一次请求之后大约有 5 到 10 秒的延迟,然后其他任何东西都可以通过。

    当然,还可以采取其他措施来提高性能,例如使用集群模块来使用机器上所有可用的处理器。但是,归根结底,节点可能不是最好的解决方案。您将从具有您需要的所有线程的传统 Web 服务器获得更好的性能。即使在使用了所有处理器之后,节点的 CPU 利用率也只提高了大约 6%。

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多