Readable.push の backpressure は drain 待ちだけでは成立しない
Node.js
バックエンド
ストリーム
知識
運用
Node.js の Readable stream を producer 側から手動で流し込み、push が false を返したら drain を待つ、という実装はそのままでは詰まりやすい。drain は Writable 側の backpressure 通知であり、Readable が標準で発火するイベントではないため、Readable に対して drain を待つだけでは再開条件が来ない。
大量データを生成しながら外部ストレージへ流す処理では、CSV や NDJSON などの全体を Buffer に積まず stream で運ぶ方針自体は正しい。ただし producer が push の戻り値で backpressure を見ているなら、再開シグナルを自前で用意する、PassThrough や Writable の write/drain を使う、または pipeline で読み書きの責務を分ける必要がある。
確認方法は、少量データの成功だけで終わらせず、push が false になる程度のデータ量や低い highWaterMark で流して、処理が完了するかを見ること。小さいデータでは backpressure が発生せず、誤った drain 待ちが潜伏する。外部アップロードの失敗時は producer 側も unblock し、元の upload error を失わずに再throwできるようにしておく。