Ответ вслух Middle Потоки и буферы обновлено

Объясни потоки и backpressure

Вопрос

Зачем в Node.js потоки и как работает backpressure?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Потоки нужны, чтобы обрабатывать данные по частям. Если отдать файл на несколько гигабайт через readFile, он целиком ляжет в память.

Что должно прозвучать в ответе

  • Потоки обрабатывают данные кусками: мало памяти, первый результат сразу

  • Четыре вида: Readable, Writable, Duplex, Transform

  • write() возвращает false после highWaterMark, ждём drain

  • pipe/pipeline делают backpressure сами

  • pipeline закрывает цепочку и передаёт ошибку, pipe нет

  • Пример: отдать файл или сжатый лог по HTTP без загрузки в память

Что могут спросить следом

  • Что будет, если игнорировать false от write?
  • Как прочитать поток через for await?
  • Как написать свой Transform?

Разбор

Потоки нужны, чтобы обрабатывать данные по частям. Если отдать файл на несколько гигабайт через readFile, он целиком ляжет в память. Поток читает его кусками по 64 КБ, и сервер держит в памяти только их.

Видов четыре: Readable, например чтение файла или тело запроса; Writable, например ответ клиенту; Duplex, где чтение и запись независимы, как в TCP-сокете; и Transform, где выход получается из входа, как в gzip.

Backpressure решает проблему разной скорости. Диск читает быстрее, чем медленный клиент скачивает. Когда буфер приёмника переполнен выше highWaterMark, write возвращает false, и источник должен остановиться до события drain. pipe и pipeline делают это автоматически.

В реальном коде я использую pipeline из stream/promises: при ошибке в любом звене он закроет все потоки и вернёт ошибку в одном месте, а pipe оставил бы висящие дескрипторы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.