面试题答案
一键面试处理背压的策略和方法
-
监听
drain
事件- 当可写流缓冲区已满时,继续写入数据会返回
false
。此时,我们可以监听可写流的drain
事件,当缓冲区有空间时,drain
事件会触发,我们可以在这个时候继续写入数据。
- 当可写流缓冲区已满时,继续写入数据会返回
-
使用
pause()
和resume()
方法- 可读流有
pause()
和resume()
方法。当可写流缓冲区满,返回false
时,我们可以调用可读流的pause()
方法暂停数据读取,当drain
事件触发时,再调用resume()
方法恢复读取。
- 可读流有
-
使用
Transform
流作为中间缓冲Transform
流可以在可读流和可写流之间起到缓冲作用,通过控制其内部缓冲区大小来处理背压。
代码示例
const fs = require('fs');
const readableStream = fs.createReadStream('largeFile.txt');
const writableStream = fs.createWriteStream('outputFile.txt');
let paused = false;
readableStream.on('data', (chunk) => {
if (paused) {
// 如果已经暂停,将数据存储到某个临时缓存中(这里简单忽略,实际应用可能需要处理)
return;
}
const writeResult = writableStream.write(chunk);
if (!writeResult) {
paused = true;
readableStream.pause();
}
});
writableStream.on('drain', () => {
paused = false;
readableStream.resume();
});
readableStream.on('end', () => {
writableStream.end();
});
在上述代码中:
- 当从可读流
readableStream
读取到数据时,尝试写入可写流writableStream
。 - 如果
write
方法返回false
,说明可写流缓冲区已满,暂停可读流,并设置paused
标志。 - 当可写流触发
drain
事件时,说明缓冲区有空间了,恢复可读流读取,并清除paused
标志。 - 当可读流结束时,结束可写流。