标准答案
- 生产者写入过快会让 Writable 缓冲增长,超过 highWaterMark 后应停止继续写。
- 消费者 drain 后生产者才能继续推送,形成从下游到上游的背压。
- pipe 通常处理暂停、恢复和基础错误传播,但复杂多流场景应使用 pipeline。
- highWaterMark 影响内存和吞吐,需要结合块大小、下游速度和延迟测试。
题目解析
write 返回 false 表示下游暂时无法继续接收,生产者应暂停;drain 代表缓冲下降到可以继续写。pipe 把这套暂停/恢复协调起来,但 highWaterMark 只是水位,不是无限容量。
highWaterMark 越大可能减少频繁暂停,却会提高内存峰值和故障时丢失量。参数要结合 chunk 大小、下游速率、连接数量和请求 deadline 压测。
客户端断开、目标写入失败和中途取消时,链路中的每个流都要销毁或结束,已产生的对象和数据库记录还要由业务状态决定是否清理。
常见误区
- 误区:无视 write 返回值。改正:false 时暂停生产并等待 drain,不能继续无界写入。
- 误区:把 highWaterMark 设置极大追求吞吐。改正:按内存预算和下游能力设置,并观察尾延迟和缓冲峰值。
- 误区:手动 pipe 链出错时只关闭当前流。改正:销毁整个链路,防止上游继续读取和文件句柄泄漏。