MST

星途 面试题库

面试题:Node.js 可写流 Writable 的背压处理

在 Node.js 中使用可写流 Writable 时,假设写入数据的速度超过了可写流处理数据的速度,会出现背压问题。请描述如何检测和处理这种背压情况,并给出一个简单的代码示例。
30.2万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 检测背压
    • 在 Node.js 中,当使用 Writable 流写入数据时,write() 方法返回 false 表示出现背压。即写入缓冲区已满,可写流暂时无法处理更多数据。
  2. 处理背压
    • write() 方法返回 false 时,需要暂停写入数据,直到可写流的 drain 事件触发。drain 事件表示可写流的缓冲区已经处理了足够的数据,有空间接受更多数据,此时可以继续写入。
  3. 代码示例
const fs = require('fs');

// 创建一个可写流,写入到文件 output.txt
const writeStream = fs.createWriteStream('output.txt');

// 要写入的数据
const data = 'a'.repeat(1024 * 1024); // 1MB 的数据

let i = 0;
const writeChunk = () => {
    let writeResult = true;
    do {
        const chunk = data.slice(i, i + 1024);
        writeResult = writeStream.write(chunk);
        i += 1024;
    } while (i < data.length && writeResult);

    if (!writeResult) {
        // 当 write() 返回 false,说明出现背压,暂停写入
        writeStream.once('drain', () => {
            writeChunk();
        });
    } else if (i === data.length) {
        // 所有数据写入完成
        writeStream.end();
    }
};

writeChunk();

上述代码中:

  • 首先创建了一个写入文件的可写流 writeStream
  • 定义了一个大字符串 data 用于模拟大量要写入的数据。
  • writeChunk 函数负责每次写入 1KB 数据块。当 write() 方法返回 false 时,暂停写入并监听 drain 事件,当 drain 事件触发时,继续调用 writeChunk 函数写入数据,直到所有数据写入完成。最后调用 writeStream.end() 结束写入操作。