Ответ вслух Senior Потоки и буферы обновлено

Загрузка файлов по 5 ГБ через Node-сервис

Вопрос

Нужно принимать от клиентов файлы до 5 ГБ и складывать в S3-совместимое хранилище. Как спроектируете это на Node?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Лучше всего, чтобы гигабайты вообще не шли через Node: сервис авторизует пользователя и выдаёт presigned URL для multipart upload, клиент грузит части напрямую в хранилище, потом сервис по событию или запросу проверяет объект и меняет статус в БД. Так сервис не тратит сеть и память, а масштабируется хранилище.

Что должно прозвучать в ответе

  • Лучший вариант: файл вообще не идёт через сервис, клиент грузит напрямую в S3 по presigned URL (multipart), сервис только выдаёт URL и проверяет результат

  • Если через сервис, то потоком: `pipeline(req, проверка размера и типа, multipart upload в S3)` без буферизации на диск или в память

  • Лимиты: максимальный размер, таймауты, число параллельных загрузок, проверка типа по содержимому, а не по расширению

  • Multipart upload: части по 5-100 МБ, ретраи отдельных частей, возобновление, очистка незавершённых загрузок (lifecycle policy)

  • После загрузки асинхронная обработка через очередь: антивирус, превью, метаданные в БД со статусом

  • Безопасность: имя объекта генерирует сервер, доступ к объекту по подписанным ссылкам

Что могут спросить следом

  • Как проверить, что клиент загрузил именно то, что обещал?
  • Что будет, если соединение оборвётся на 4-м гигабайте?
  • Как ограничить скорость или размер на потоке?

Разбор

Лучше всего, чтобы гигабайты вообще не шли через Node: сервис авторизует пользователя и выдаёт presigned URL для multipart upload, клиент грузит части напрямую в хранилище, потом сервис по событию или запросу проверяет объект и меняет статус в БД. Так сервис не тратит сеть и память, а масштабируется хранилище. Если поток обязан идти через сервис (шифрование, проверка на лету), то только стримом: pipeline(req, transform с подсчётом байт и проверкой сигнатуры, upload в S3 частями), без записи на локальный диск и без буфера в памяти. Обязательно лимиты размера и времени, лимит параллельных загрузок, тип файла по магическим байтам. Multipart даёт ретраи отдельных частей и возобновление после обрыва, а незавершённые загрузки чистит lifecycle-политика. Дальше тяжёлая обработка (антивирус, превью) асинхронно через очередь.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.