Чем pipeline лучше pipe
Вопрос
Почему в продакшен-коде вместо src.pipe(transform).pipe(res) рекомендуют await pipeline(src, transform, res) из node:stream/promises?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
pipelineбыстрее, потому что копирует данные без буферизации.pipe()не поддерживает backpressure, аpipelineподдерживаетpipelineсобирает ошибки звеньев и закрывает все потоки цепочкиправильный ответpipelineчитает источник целиком в память, поэтому надёжнее
Разбор
Backpressure есть и у .pipe(), это неверный аргумент. Проблема .pipe() в ошибках и очистке: событие error не передаётся по цепочке, каждому потоку нужен свой обработчик, а если клиент оборвал соединение, источник (файл, курсор БД) продолжает висеть открытым, отсюда утечки дескрипторов. pipeline подписывается на ошибки всех звеньев, при первой уничтожает все потоки и отдаёт одну ошибку в промис или колбэк.
Скорость одинаковая, механизм передачи тот же. В память pipeline ничего целиком не читает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Потоки и буферы»
- Пачки из асинхронного итератора
- Разбиение потока на строки по чанкам
- Запись с учётом backpressure
- Итоги платежей из CSV-выгрузки
- Слияние k отсортированных логов
- Топ эндпоинтов по access-логу с нормализацией маршрутов
- Сессии пользователей по потоку событий
- Код-ревью: выгрузка и загрузка больших файлов