Объясни потоки и backpressure
Вопрос
Зачем в Node.js потоки и как работает backpressure?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Потоки обрабатывают данные кусками: мало памяти, первый результат сразу
Четыре вида: 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 ошибок.
Термины по теме
Ещё по теме «Потоки и буферы»
- Пачки из асинхронного итератора
- Разбиение потока на строки по чанкам
- Запись с учётом backpressure
- Итоги платежей из CSV-выгрузки
- Слияние k отсортированных логов
- Топ эндпоинтов по access-логу с нормализацией маршрутов
- Сессии пользователей по потоку событий
- Код-ревью: выгрузка и загрузка больших файлов