如果我没记错的话,我记得异步I / O的“事件循环”模型(Node.js,Nginx)不适合用于提供大文件。
是这种情况,如果是,周围是否有方法?我正在考虑在Node中编写一个实时文件浏览器/文件服务器,但是文件的大小可能在100MB到3GB之间。我认为事件循环将一直阻塞直到文件被完全提供为止?
不,它不会被阻止。node.js将分块读取文件,然后将那些块发送到客户端。在大块之间,它将处理其他请求。
通过网络读取文件和发送数据是I / O绑定的操作。首先,node.js将要求操作系统读取文件的一部分,而在操作系统执行该操作时,node.js将为另一个请求提供服务。当操作系统将数据返回到node.js时,node.js将告诉操作系统将数据发送到客户端。在发送数据时,node.js将处理另一个请求。
自己尝试:
创建一个大文件
dd if=/dev/zero of=file.dat bs=1G count=1
运行此node.js应用
var http = require('http'); var fs = require('fs'); var i = 1; http.createServer(function (request, response) { console.log('starting #' + i++); var stream = fs.createReadStream('file.dat', { bufferSize: 64 * 1024 }); stream.pipe(response); }).listen(8000); console.log('Server running at http://127.0.0.1:8000/');
请求http://127.0.0.1:8000/几次并观察node.js处理所有这些。
http://127.0.0.1:8000/
如果要提供大量大文件,则可能需要尝试使用不同的bufferSize值。