NodeJs流管道是否对称?

时间:2016-08-09 15:32:55

标签: node.js stream pipe

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

我想知道NodeJs流管道是否对称? 如果我执行以下操作:request.get(A).pipe(request.put(B));,它上传的速度是否与下载速度一样快?

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

1 个答案:

答案 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套接字 - 下面发生的事情可能是高度的取决于您的系统/网络配置。