Backpressure in JavaScript
4 months ago
- #JavaScript
- #Streams
- #Backpressure
- 背压是一种系统级反馈机制,当数据生产速度超过处理能力时,允许消费者减缓生产者的速度。
- 在JavaScript中忽视背压会导致内存激增、延迟崩溃以及因无界队列引发的系统崩溃。
- 背压现象存在于Node.js流、Fetch API、Web Streams和异步循环中,但需要显式处理。
- 常见错误包括忽略`write()`返回值、对大数据集使用`Promise.all()`以及将整个文件读入内存。
- Unix管道、TCP流量控制和RabbitMQ等消息系统也实现了背压机制。
- Node.js流通过`highWaterMark`控制缓冲区大小,利用`drain`事件管理流量。
- 如果在循环中未妥善控制异步任务,`async/await`可能掩盖背压问题。
- 浏览器中的Web Streams通过基于拉取的读取和`write()`承诺来强制实施背压。
- 缓冲区有助于管理短期的速度不匹配,但如果滥用或未设上限反而会掩盖问题。
- 背压问题的症状包括内存增长、延迟峰值以及高CPU占用伴随低吞吐量。
- 设计支持背压的代码需要限制并发度、采用基于拉取的设计并监控数据流动。