2017-02-28 92 views
3

我想了解在加載大量內容時nodejs的限制。具體而言,我想知道是否對客戶端進行長時間響應會阻止。是否流式傳輸http響應塊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響應被阻塞,那麼它應該等到第一個請求完成後再接受第二個請求。如果數據流不阻塞,那麼我希望在請求後立即看到所有請求記錄。

有人可以解釋這一點嗎?

我也很想聽聽關於表演的任何想法。節點可能並不是真的爲這種事情而構建的。下載速度確實受到多個請求的影響。

回答

2

經過一些更多的研究,我可以看到事件循環的不同階段如何導致我看到的結果。節點guides解釋了執行所有I/O事件的輪詢階段將如何在需要時阻塞,並且它也具有最大堆棧,因此它不會完全阻塞主線程太長時間。

這可以解釋我看到哪裏有很多I/O事件(即使我沒有聽他們的目錄on('data')...)可能會暫時阻止您的節點應用程序。在第一次請求之後,我看到大約5到10秒的延遲,然後才能完成任何其他操作。

當然還有其他一些可以提高性能的方法,例如使用羣集模塊來使用機器上所有可用的處理器。但是,在一天結束時,節點可能不是這裏最好的解決方案。從傳統的Web服務器獲得所需的所有線程,性能會更好。即使在使用所有處理器之後,我只是推動節點6%的CPU利用率。

相關問題