Stream
Stream 是分块处理数据的抽象,常用于文件、网络和管道式处理,并通过背压机制避免一次性把大数据全部压进内存。
#type / concept
#status / evergreen
#tech / dev / backend
#resource / nodejs
#resource / javascript
[!info] related notes
- 所属 MOC: Node.js MOC, Node.js 后端面试 MOC
- 前置概念: [[buffer|Buffer]]
- 并列概念: worker-threads
- 相关主题: Node.js 运行时架构
Stream
Stream 是按块处理数据的抽象,适合大文件、网络传输和流式消费场景。
一句话定义
Stream 不是“一次把完整数据拿到手再处理”,而是把数据拆成很多块,在读取、转换和写出过程中边流动边处理。
核心机制 / 工作原理
它最重要的价值有两个:
- 避免把大文件或大响应一次性全读进内存
- 通过背压让生产速度和消费速度保持平衡
常见类型
- Readable
- Writable
- Duplex
- Transform
背压
如果写入端来不及消费,读取端就不该继续无节制地灌数据。
这就是背压问题。
在 Node.js 里,pipe 和 pipeline 的价值之一就是帮你处理这类协调。
最小例子 / 最小场景
下载大文件时,比起:
const data = await fs.promises.readFile('./large.mp4');
res.send(data);
更稳的是:
import fs from 'node:fs';
const stream = fs.createReadStream('./large.mp4');
stream.pipe(res);
边界与易混淆点
Stream 不等于更快的 CPU 计算
它主要优化的是内存占用和 I/O 处理方式,不是把 CPU 密集任务自动并行化。
什么时候更推荐 pipeline
如果链路里有多个流,且你希望统一错误处理和关闭资源,通常比裸 pipe 更稳。
相关笔记
- [[buffer|Buffer]]
- EventEmitter