🌊

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をバッファリングなしでそのまま転送