📜  Node.js Stream writable.writableHighWaterMark 属性(1)

📅  最后修改于: 2023-12-03 14:44:40.454000             🧑  作者: Mango

Node.js Stream writable.writableHighWaterMark 属性

在 Node.js 中,writable.writableHighWaterMark 是一个可写流的属性,它表示了可写流内部缓冲区的高水位线(high watermark)。当缓冲区中数据的字节长度超过了高水位线,可写流将会停止接收更多的写入请求,直到当前的缓冲区数据被消耗一部分。

可写流的原理

在 Node.js 中,可写流是通过内部缓存区实现数据的暂存和传输的。当通过 stream.write(data) 写入数据时,它并不是立即写入到目标,而是写入到内部缓冲区。

当可写流的缓冲区已满,继续向其写入数据将会导致一个状态变化,它会触发 stream.write() 方法调用的回调函数的返回值(即 false)。这表示流已满,不能继续写入新的数据。此时,通常需要暂停生产者(producer),等待消费者(consumer)来消费内部缓存区中的一些数据。

当缓存区中的数据被消费一部分后,可写流认为消费者已经消费了足够多的数据,缓存区已经腾出空间来继续暂存新的数据,这个状态变化会触发 stream.write() 方法调用的回调函数的返回值(即 true)。这样生产者就可以向可写流继续写入新的数据。

writableHighWaterMark 属性

writableHighWaterMark 是一个可写流的属性,它表示可写流内部缓冲区的高水位线。当缓冲区中的数据量超过了高水位线时,可写流会被告知流已满,生产者(producer)必须等待消费者(consumer)来消费一些数据。

该属性的默认值为 16384,即 16KB。你可以通过 writable.writableHighWaterMark 属性来修改该值,但是一旦修改,该值就会应用于所有通过该可写流创建的 Writeable 流。例如:

const { Writable } = require('stream');
const stream = new Writable({
  write(chunk, encoding, callback) {
    // console.log(chunk.toString('utf8'));
    callback();
  }
});

console.log(stream.writableHighWaterMark); // 16384
stream.writableHighWaterMark = 2048;
console.log(stream.writableHighWaterMark); // 2048

上面的代码中,通过创建一个可写流并打印该流的高水位线,它的默认值为 16384。我们再将该值修改为 2048,并再次打印该值,它的值就被修改为了 2048

修改可写流的高水位线可能会潜在地影响流的吞吐量。较小的值意味着更频繁的调用 write 方法以将数据刷新到目标,而较大的值意味着更长时间的缓冲区,更少的 write 方法的调用,从而提高吞吐量。你可以根据实际情况调整该值,以达到性能最优化。

参考资料