流的高级背压:构建自定义可写流与转换流的水位线控制
深入 stream 内部状态,实现自己的 highWaterMark 逻辑,以及基于背压的速率限制器。 · 难度:入门 · +10XP
自定义背压与水位线
Node.js 流通过 highWaterMark 控制内部缓冲区大小。自定义 Writable 的 _write 可以通过 callback 控制写入速度,Transform 则可以在 _transform 中暂停/恢复。本教程将构建一个“限速转换流”,它只允许每秒固定字节通过,利用 write 返回 false 时暂停上游 readable,并设置定时器恢复。
const { Transform } = require('stream');
class Throttle extends Transform {
constructor(rate) {
super();
this.rate = rate;
this.lastTime = 0;
}
_transform(chunk, encoding, callback) {
const now = Date.now();
const wait = this.lastTime + 1000/this.rate - now;
if (wait > 0) {
setTimeout(() => {
this.lastTime = Date.now();
callback(null, chunk);
}, wait);
} else {
this.lastTime = now;
callback(null, chunk);
}
}
}