Проектирование Middle Мобильный system design обновлено

Мобильный system design: загрузка фото и видео

Вопрос

Спроектируйте в приложении загрузку фото и видео (до 2 ГБ) в облако: выбор из галереи, прогресс, фоновая загрузка, возобновление после обрыва, экономия трафика.

Коротко

Пользователь выбирает файлы, клиент сразу создаёт записи в очереди загрузок (база) и показывает их со статусом. Подготовка в фоне: видео перекодируется в разумный битрейт, фото в JPEG или HEIC с ограничением размера, считается хеш (для дедупликации на сервере).

Что должно быть в решении

  1. 1
    Требования: размеры файлов, фоновая работа, только Wi-Fi по настройке, прогресс, отмена
  2. 2
    Подготовка: сжатие и перекодирование видео, HEIC/JPEG, удаление геометки по настройке, хеш файла
  3. 3
    API: создание сессии загрузки, presigned URL на части, завершение и подтверждение
  4. 4
    Клиент: очередь загрузок в базе, фоновая сессия или WorkManager, параллельность частей
  5. 5
    Надёжность: повтор частей с backoff, возобновление после перезапуска, проверка целостности
  6. 6
    UX и ресурсы: прогресс, пауза, уведомление о завершении, батарея и трафик

Что спросит интервьюер

  • Как продолжить загрузку после того, как система выгрузила приложение?
  • Как не загружать дубликаты одних и тех же фото?

Разбор

Пользователь выбирает файлы, клиент сразу создаёт записи в очереди загрузок (база) и показывает их со статусом. Подготовка в фоне: видео перекодируется в разумный битрейт, фото в JPEG или HEIC с ограничением размера, считается хеш (для дедупликации на сервере).

API: POST /uploads создаёт сессию и возвращает размер части и presigned URL для частей; клиент грузит части напрямую в объектное хранилище; POST /uploads/{id}/complete собирает файл. Сервер по хешу может сразу ответить «уже есть».

Выполнение: на iOS фоновая URLSession с upload-задачами из файлов (части пишутся во временные файлы), на Android WorkManager с ограничением по сети (только Wi-Fi, если выбрано) и foreground service с уведомлением для больших файлов. Части грузятся в 2-3 потока, ошибки повторяются с экспоненциальной задержкой, прогресс сохраняется, и после перезапуска загрузка продолжается с первой незагруженной части.

UX: прогресс в списке и в уведомлении, пауза и отмена, уведомление о завершении. Ресурсы: ограничение параллельности, отказ от загрузки при низком заряде по настройке.

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

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