Загрузка файлов по 5 ГБ через Node-сервис
Вопрос
Нужно принимать от клиентов файлы до 5 ГБ и складывать в S3-совместимое хранилище. Как спроектируете это на Node?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Лучший вариант: файл вообще не идёт через сервис, клиент грузит напрямую в 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 ошибок.
Предыдущий вопрос
Код-ревью: выгрузка и загрузка больших файлов
Следующий вопрос
Чем pipeline лучше pipe
Термины по теме
Ещё по теме «Потоки и буферы»
- Пачки из асинхронного итератора
- Разбиение потока на строки по чанкам
- Запись с учётом backpressure
- Итоги платежей из CSV-выгрузки
- Слияние k отсортированных логов
- Топ эндпоинтов по access-логу с нормализацией маршрутов
- Сессии пользователей по потоку событий
- Buffer.allocUnsafe