Отдача больших файлов: буфер в памяти против потока
Эндпоинт отдаёт клиентам архивы выгрузок размером 300–500 МБ:
app.get('/export/:id', async (req, res) => {
const data = await fs.promises.readFile(pathTo(req.params.id));
res.setHeader('Content-Type', 'application/zip');
res.end(data);
});
При 15–20 одновременных скачиваниях контейнер упирается в лимит памяти и перезапускается. Какое объяснение и решение верны?
- Файл целиком попадает в память на каждое соединение; нужно отдавать поток чтения через `pipe`, чтобы данные шли кусками с учётом backpressure
- Проблема в `await`: асинхронное чтение держит буфер до конца запроса, достаточно перейти на `fs.readFileSync`
- Память течёт из-за отсутствия `res.end()` в ветке ошибок; нужно добавить обработчик ошибок и увеличить лимит контейнера
- Node.js не рассчитан на раздачу файлов: такие ответы должен отдавать только внешний CDN или объектное хранилище
