我正在构建一个服务器,它将文件从端点A传输到端点B.
我想知道NodeJs流管道是否对称?
如果我执行以下操作:request.get(A).pipe(request.put(B));
,它上传的速度是否与下载速度一样快?
我问这个问题,因为我的服务器有一个非对称连接(下载速度比上传速度快),我尽量避免内存消耗。
答案 0 :(得分:2)
根据节点的documentation on stream#pipe pipe会将读取流切换为流动模式 - 只有在写入流完成消耗以前的数据包时才会读取。
readable.pipe()方法将可写流附加到可读的流,使其自动切换到流动模式并将其所有数据推送到附加的Writable。将自动管理数据流,以便目标可写流不会被更快的可读流淹没。
因此,由于发送/下载速度不同,您的传输可能不对称 - 差异可能会在Node的内存中缓冲 - Buffering of streams
缓冲#
可写和可读流都将数据存储在内部 可以使用writable._writableState.getBuffer()检索的缓冲区 或者read._readableState.buffer。
可能缓冲的数据量取决于highWaterMark 选项传递给流构造函数。对于普通的流, highWaterMark选项指定总字节数。对于溪流 在对象模式下操作,highWaterMark指定总数 对象。
实现调用时,数据在可读流中缓冲 stream.push(块)。如果Stream的消费者没有打电话 stream.read(),数据将位于内部队列中,直到它为止 消耗掉。
内部读缓冲区的总大小达到阈值后 由highWaterMark指定,该流将暂时停止读取 来自底层资源的数据,直到当前缓冲的数据 可以消费(也就是说,流将停止调用内部 readable._read()方法,用于填充读缓冲区。)
当writable.write(chunk)时,数据在Writable流中缓冲 方法被重复调用。而内部的总大小 写入缓冲区低于highWaterMark设置的阈值,调用 writable.write()将返回true。一旦内部的大小 缓冲区达到或超过highWaterMark,将返回false。
流API的关键目标,特别是stream.pipe() 方法,是将数据缓冲限制在可接受的水平 不同速度的来源和目的地不会淹没 可用内存。
由于Duplex和Transform流都是可读和可写的, 每个维护两个独立的内部缓冲区用于读取和 写作,允许每一方独立于另一方运作 同时保持适当和有效的数据流。对于 例如,net.Socket实例是可读方的双工流 允许使用从套接字接收的数据和其Writable side允许将数据写入套接字。因为可能会写入数据 套接字以比接收数据更快或更慢的速率,它是 重要的是每一方都独立地操作(和缓冲)。
我建议你看看this question这里的主题是进一步阐述的。
如果您运行以下示例
const http = require('http');
http.request({method:'GET', host:'somehost.com', path: '/cat-picture.jpg'}, (response)=>{
console.log(response);
}).end()
您可以探索底层套接字 - 在我的系统上,它们都具有highWaterMark : 16384
属性。因此,如果我理解文档和上述问题,在您的情况下,大约16KB可以缓存在Node.js级别上更快的GET
套接字 - 下面发生的事情可能是高度的取决于您的系统/网络配置。