🌊
Node.js Streams — 大容量データをメモリ爆発なしで処理する方法
Readable、Writable、Transform + backpressureの動作原理
Backpressure
writable.write(chunk)がfalseを返すと内部バッファが満杯。Readableが一時停止、Writableの'drain'イベントを待つ。.pipe()がこれを自動処理。
Backpressureなし:速いReadable + 遅いWritable → バッファ増大→メモリ爆発。
pipeline()
.pipe()はエラー伝搬しない — ストリームがリークする可能性。pipeline()がエラー時全ストリームを自動destroy。
キーポイント
1
Streamはデータをchunk単位で処理 — 全体をメモリに載せない
2
pipe()でReadable→Transform→Writableチェーン
3
write()がfalse返却=バッファ満杯→pause/drainでbackpressure処理
4
pipeline()がpipe()より安全 — エラー時全ストリーム自動destroy
ユースケース
CSV/ログファイル処理 — GBスケールファイルをメモリ64KBで処理
HTTPプロキシ — リクエストbodyをバッファリングなしでそのまま転送