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