Вступить в клуб →
средняявопросАсинхронность и event loop

Отдача больших файлов: буфер в памяти против потока

Эндпоинт отдаёт клиентам архивы выгрузок размером 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 или объектное хранилище

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела