Node.js Stream 的四种类型与 pipe 机制的原理
请说明 Node.js 中 Stream 的四种基本类型(Readable、Writable、Duplex、Transform)的区别与使用场景,并解释 .pipe() 方法如何实现背压(backpressure)控制。
回答
编译有声
四种 Stream 类型:
- Readable(可读流):数据源,如
fs.createReadStream、http.IncomingMessage - Writable(可写流):数据目标,如
fs.createWriteStream、http.ServerResponse - Duplex(双工流):既可读又可写,如
net.Socket、zlib.Transform - Transform(转换流):双工流,在读写过程中可修改数据,如
zlib.createGzip、crypto.createCipher
pipe 与背压机制:
readable.pipe(writable);
pipe()自动监听 Readable 的data事件读取数据,调用 Writable 的write()写入- 背压(Backpressure):当 Writable 的内部缓冲区超过
highWaterMark(默认16KB),write()返回false,此时 Readable 暂停data事件发射 - 当 Writable 缓冲区排空后触发
drain事件,Readable 恢复数据流动 - 这形成自动流控,避免内存溢出
自定义 Stream:实现 _read()、_write()、_transform()、_flush() 等方法。