Ответ вслух Middle System design на фронте спрашивают часто обновлено

Загрузка больших файлов

Вопрос

Спроектируй загрузку файлов: до двух гигабайт, нестабильная сеть, прогресс.

Веди разговор вслух, как на секции. Начинать с решения - главная ошибка: первые полторы минуты только вопросы.

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

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

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

Коротко

Два гигабайта одним запросом не отправляются: обрыв на девяносто процентах означает начать заново. Значит загрузка по частям: файл режется на куски по 5–10 МБ, каждый отправляется отдельно, упавший повторяется.

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

  • уточнил размеры, типы, сколько файлов разом и нужен ли просмотр

  • загрузка по частям с возможностью докачки после обрыва

  • прямая загрузка в хранилище по подписанной ссылке, минуя свой бэкенд

  • параллельность ограничена: три-четыре части разом, не все сразу

  • прогресс по каждой части и суммарный, отмена через AbortController

  • проверка типа и размера до начала загрузки

  • повтор упавшей части с экспоненциальной задержкой

  • что происходит при закрытии вкладки - предупреждение и возможность продолжить

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

  • Как возобновить загрузку после перезагрузки страницы?
  • Где хранить состояние незавершённой загрузки?
  • Что делать, если файл нужно обработать перед отправкой?

Разбор

Два гигабайта одним запросом не отправляются: обрыв на девяносто процентах означает начать заново. Значит загрузка по частям: файл режется на куски по 5–10 МБ, каждый отправляется отдельно, упавший повторяется.

Прямо в хранилище по подписанной ссылке - иначе весь трафик идёт через наш бэкенд и кладёт его. Бэкенд выдаёт подписанные ссылки на части и подтверждает сборку.

Здесь стоит назвать частые грабли: подпись покрывает хост, поэтому ссылка, подписанная внутренним адресом хранилища, из браузера не работает - наружу хранилище должно смотреть тем же origin, что в подписи.

Параллельность ограничиваем: три-четыре части одновременно. Больше - упираемся в лимит соединений и делаем хуже.

Прогресс считаем по завершённым частям плюс текущая; отмена - через AbortController. Проверку типа и размера делаем до начала, а не после. И предупреждение при закрытии вкладки с незавершённой загрузкой.

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

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