流和背压机制
Node.js 中的流是一种处理数据的抽 象接口。流可以是可读的、可写的或双工的(既可读又可写)。流的主要类型包括:
-
Readable Stream(可读流):用于从数据源读取数据。例如,fs.createReadStream() 用于从文件中读取数据。
-
Writable Stream(可写流):用于将数据写入目标。例如,fs.createWriteStream() 用于将数据写入文件。
-
Duplex Stream(双工流):同时实现了可读和可写接口。例如,网络套接字。
-
Transform Stream(转换流):一种双工流,在写入和读取数据时可以修改或转换数据。例如,zlib.createGzip() 用于压缩数据。
背压(Backpressure)
背压是指在处理流数据时,数据生产者的速度超过了数据消费者的处理能力,从而导致数据积压的现象。Node.js 提供了一种机制来处理这种情况,以防止内存溢出或应用程序崩溃。
背压处理机制
暂停和恢复流:可读流可以通过 stream.pause() 和 stream.resume() 方法来手动控制流的流动。
管道(Pipe)机制
Node.js 提供了 stream.pipe() 方法,可以自动处理背压。它会根据可写流的 drain 事件来暂停和恢复可读流。
highWaterMark 参数
在创建流时,可以通过设置 highWaterMark 参数来控制缓冲区的大小,从而影响背压的触发点。
通过合理使用流和背压机制,Node.js 应用程序可以高效地处理大规模数据传输,而不会因为内存问题而崩溃。