面试题答案
一键面试- 检测背压:
- 在Node.js的Readable流中,可以通过监听
drain
事件来检测背压。当write
方法返回false
时,表示下游缓冲区已满,发生了背压,此时可以暂停读取数据。当drain
事件触发时,意味着下游缓冲区有空间了,可以继续读取数据。
- 在Node.js的Readable流中,可以通过监听
- 处理背压:
- 代码示例:
const fs = require('fs');
const readableStream = fs.createReadStream('largeFile.txt');
readableStream.on('data', (chunk) => {
// 尝试写入数据到下游,这里假设下游是一个模拟的write函数
const writeResult = writeToDownstream(chunk);
if (!writeResult) {
// 如果write返回false,说明发生背压,暂停读取
readableStream.pause();
}
});
readableStream.on('drain', () => {
// 当drain事件触发,说明下游缓冲区有空间,继续读取
readableStream.resume();
});
function writeToDownstream(chunk) {
// 模拟下游处理数据,这里简单返回true或false
// 实际中应根据下游缓冲区的状态返回
return Math.random() > 0.5;
}
在上述代码中:
createReadStream
创建了一个可读流来读取largeFile.txt
。- 在
data
事件处理函数中,调用writeToDownstream
模拟向下游写入数据。如果writeToDownstream
返回false
,则暂停可读流,防止数据堆积。 drain
事件触发时,恢复可读流,继续读取数据,从而处理背压情况,确保系统稳定运行。