Node.js NodeJs流管道是对称的吗?

Node.js NodeJs流管道是对称的吗?,node.js,stream,pipe,Node.js,Stream,Pipe,我正在构建一个服务器,它将文件从端点a传输到端点B 我想知道NodeJs流管道是否对称? 如果我执行以下操作:request.get(A.pipe(request.put(B)),它的上传速度和下载速度一样快吗 我问这个问题,因为我的服务器有一个非对称连接(下载比上传快),我尽量避免内存消耗。根据节点的 管道将把读流切换到流动模式-当写流已经完成使用以前的数据包时,它将只读 readable.pipe()方法将一个可写流附加到可读文件,使其自动切换到流动模式,并将其所有数据推送到附加的可写文件。

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

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

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

根据节点的 管道将把读流切换到流动模式-当写流已经完成使用以前的数据包时,它将只读

readable.pipe()方法将一个可写流附加到可读文件,使其自动切换到流动模式,并将其所有数据推送到附加的可写文件。数据流将被自动管理,以便目标可写流不会被更快的可读流淹没

因此,由于不同的发送/下载速度,您的传输可能是不对称的-差异可能会缓冲在节点的内存中-

缓冲#

可写流和可读流都将数据存储在内部数据库中 可以使用writable检索的缓冲区。\u writableState.getBuffer() 或可读。_readableState.buffer

潜在缓冲的数据量取决于highWaterMark 选项传递到streams构造函数中。对于正常流 highWaterMark选项指定总字节数。溪流 在对象模式下运行时,highWaterMark指定一个总数 物体的形状

当实现调用时,数据缓冲在可读流中 stream.push(块)。如果流的使用者不调用 stream.read(),数据将位于内部队列中,直到 消耗掉了

一旦内部读取缓冲区的总大小达到阈值 由highWaterMark指定,流将暂时停止读取 从基础资源中删除数据,直到数据当前被缓冲 可以使用(也就是说,流将停止调用内部 可读。_read()方法,用于填充读取缓冲区)

当Writable.write(块)被删除时,数据被缓冲在可写流中 方法被重复调用。而内部的总大小 写入缓冲区低于highWaterMark设置的阈值,调用 writeable.write()将返回true。一旦内部的尺寸 缓冲区达到或超过highWaterMark,将返回false

流API的一个关键目标,尤其是stream.pipe() 方法是将数据缓冲限制在可接受的水平,例如 不同速度的来源和目的地不会压倒 可用内存

因为双工和转换流都是可读写的, 每个都有两个单独的内部缓冲区,用于读取和读取数据 书写,允许每一方独立于另一方进行操作 同时保持适当和高效的数据流。对于 例如,net.Socket实例是双工流,其可读端 允许使用从套接字接收的数据及其可写性 side允许将数据写入套接字。因为数据可能会被写入 如果套接字的接收速度比数据接收速度快或慢,则 重要信息:每一侧独立于另一侧操作(和缓冲)

我建议大家在这里进一步阐述这个主题

如果运行以下示例

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
socket-下面发生的情况可能高度依赖于您的系统/网络配置

嗯。非常感谢。如果您真正理解,下载请求将在上载过程中暂停(对于正在进行的区块)?@user3100287我对我的答案进行了一些改进,但我觉得它仍然不完整,我参考了一些好的stackoverflow问题,这些问题可能会帮助您理解问题。