NodeJsstreampipe道是对称的吗?

我正在构build一个服务器,将文件从端点A传输到端点B.

我想知道如果NodeJsstreampipe是对称的? 如果我这样做: request.get(A).pipe(request.put(B)); ,它的上传速度和下载一样快吗?

我问这个问题,因为我的服务器有一个不对称的连接(它下载比上传更快),我尽量避免内存消耗。

根据stream的节点文档#pipe pipe将读取stream切换到stream动模式 – 只有在写入stream消耗了以前的数据包时才会读取。

readable.pipe()方法将可写的stream附加到可读,使其自动切换到stream动模式,并将其所有数据推送到附加的Writable。 数据stream将被自动pipe理,以便目标可写入stream不会被更快的可读stream覆盖。

所以你的传输可能是不对称的,由于不同的发送/下载速度 – 差异可能被caching在节点的内存中 – 缓冲stream

缓冲#

Writable和Readablestream都将数据存储在内部缓冲区中,可以分别使用writable._writableState.getBuffer()或readable._readableState.buffer进行检索。

可能缓冲的数据量取决于传入stream构造函数的highWaterMark选项。 对于普通stream,highWaterMark选项指定总字节数 。 对于以对象模式运行的stream,highWaterMark指定对象的总数。

当实现调用stream.push(块)时,数据被缓冲在可读stream中。 如果Stream的使用者没有调用stream.read(),那么数据将被放在内部队列中,直到它被使用。

一旦内部读取缓冲区的总大小达到highWaterMark指定的阈值,stream将暂时停止从底层资源读取数据,直到当前缓冲的数据可以被使用 (即,stream将停止调用内部可读。读( )方法,用来填充读缓冲区)。

当writeable.write(chunk)方法被重复调用时,数据被caching在Writablestream中。 内部写入缓冲区的总大小低于highWaterMark设置的阈值时,调用writable.write()将返回true。 一旦内部缓冲区的大小达到或超过highWaterMark,将返回false。

streamAPI的一个关键目标,特别是stream.pipe()方法,是将数据的缓冲限制在可接受的水平,这样不同速度的数据源和目标将不会压倒可用内存

由于Duplex和Transform数据stream都是可读和可写的,因此每个数据stream都维护两个独立的内部缓冲区,用于读写,允许各方独立于另一个操作,同时保持适当和高效的数据stream。 例如,net.Socket实例是Duplexstream,其可读端允许使用从套接字接收的数据,并且其可写端允许将数据写入套接字。 因为数据可能以比接收数据更快或更慢的速率被写入套接字,所以重要的是每一方独立于另一方操作(和缓冲)。

我build议你在这里看这个问题 ,这个话题是进一步阐述的。

如果您运行以下示例

 const http = require('http'); http.request({method:'GET', host:'somehost.com', path: '/cat-picture.jpg'}, (response)=>{ console.log(response); }).end() 

你可以探索底层套接字 – 在我的系统上,他们都有highWaterMark : 16384属性。 所以如果我理解了文档和上面提到的问题,在你的情况下,大约16KB可能被caching在Node.js级别的更快的GET套接字 – 下面发生的事情可能高度依赖于你的系统/networkingconfiguration。