Загрузка больших файлов
Вопрос
Спроектируй загрузку файлов: до двух гигабайт, нестабильная сеть, прогресс.
Веди разговор вслух, как на секции. Начинать с решения - главная ошибка: первые полторы минуты только вопросы.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
уточнил размеры, типы, сколько файлов разом и нужен ли просмотр
загрузка по частям с возможностью докачки после обрыва
прямая загрузка в хранилище по подписанной ссылке, минуя свой бэкенд
параллельность ограничена: три-четыре части разом, не все сразу
прогресс по каждой части и суммарный, отмена через AbortController
проверка типа и размера до начала загрузки
повтор упавшей части с экспоненциальной задержкой
что происходит при закрытии вкладки - предупреждение и возможность продолжить
Что могут спросить следом
- Как возобновить загрузку после перезагрузки страницы?
- Где хранить состояние незавершённой загрузки?
- Что делать, если файл нужно обработать перед отправкой?
Разбор
Два гигабайта одним запросом не отправляются: обрыв на девяносто процентах означает начать заново. Значит загрузка по частям: файл режется на куски по 5–10 МБ, каждый отправляется отдельно, упавший повторяется.
Прямо в хранилище по подписанной ссылке - иначе весь трафик идёт через наш бэкенд и кладёт его. Бэкенд выдаёт подписанные ссылки на части и подтверждает сборку.
Здесь стоит назвать частые грабли: подпись покрывает хост, поэтому ссылка, подписанная внутренним адресом хранилища, из браузера не работает - наружу хранилище должно смотреть тем же origin, что в подписи.
Параллельность ограничиваем: три-четыре части одновременно. Больше - упираемся в лимит соединений и делаем хуже.
Прогресс считаем по завершённым частям плюс текущая; отмена - через AbortController.
Проверку типа и размера делаем до начала, а не после. И предупреждение при закрытии вкладки
с незавершённой загрузкой.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.