Back Pressure (обратное давление) — это механизм контроля потока данных в Node.js стримах, который предотвращает переполнение памяти, когда потребитель не успевает обрабатывать данные так быстро, как их производит источник.
Аналогия из жизни: представьте садовый шланг, подключенный к насосу. Если вы перекрываете кран (замедляете потребление), давление в шланге возрастает (back pressure), и насос должен снизить подачу воды.
const { createReadStream, createWriteStream } = require('fs');
const src = createReadStream('large-file.txt');
const dest = createWriteStream('output.txt');
src.pipe(dest); // Механизм back pressure работает автоматически
Без контроля потока:
FATAL ERROR: JavaScript heap out of memory
.pipe()
автоматически обрабатывает back pressure'drain'
— Writable готов принимать новые данные'pause'
/'resume'
— управление потоком Readable// Ручное управление back pressure
const src = createReadStream('source.txt');
const dest = createWriteStream('dest.txt');
src.on('data', (chunk) => {
const canContinue = dest.write(chunk);
if (!canContinue) {
src.pause(); // Приостанавливаем чтение
dest.once('drain', () => src.resume()); // Возобновляем при готовности
}
});
// Опасный код! Может привести к переполнению памяти
http.createServer((req, res) => {
const stream = fs.createReadStream('huge-file');
stream.on('data', chunk => res.write(chunk)); // Нет проверки готовности
stream.on('end', () => res.end());
});
http.createServer((req, res) => {
const stream = fs.createReadStream('huge-file');
stream.on('data', chunk => {
if (!res.write(chunk)) {
stream.pause(); // Приостанавливаем при переполнении буфера
}
});
res.on('drain', () => stream.resume());
stream.on('end', () => res.end());
});
Back Pressure — критически важный механизм для:
Без него:
В Node.js реализован:
.pipe()
'drain'
, 'pause'
/'resume'
Всегда используйте механизмы контроля потока при работе со стримами в Node.js!