Проекты

Кейс: как решили проблему загрузки больших файлов на видеопортал

Кейс: как решили проблему загрузки больших файлов на видеопортал

Коротко

  • 01
    Клиент

    Сеть клиник пластической хирургии, выпускает нити для подтяжки кожи под собственным брендом

  • 02
    Задача

    Загружать на сайт компании много видеозаписей в высоком качестве, независимо от скорости интернета и возможных обрывов связи

  • 03
    Решение

    Дробить большие файлы на кусочки по 10 Мб, загружать их по отдельности, а потом собирать вместе

  • 04
    Результат

    — Можно загружать видеофайлы любого размера

    — Если соединение с сервером ненадолго прервется, файл все равно загрузится

    — Можно загружать несколько видео одновременно с разных устройств

Чтобы обучать хирургов работе с продуктом, компания записывает видео

Компания занимается пластической хирургией, производит нити для подтяжки кожи под собственным брендом и продает их другим клиникам. Чтобы врачи активно использовали нити в своей практике, компания проводит обучение: авторские курсы, тренинги, интенсивы, вебинары. Все обучающие материалы доступны на бесплатном видеопортале.

Видеоролики на портале
Видеопортал — это база знаний для пластических хирургов. Заказчик загружает видеозаписи в высоком разрешении, вес большинства файлов больше 5 Гб

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

Мы полностью переписали бэкенд и фронтенд портала, переделали структуру базы данных и всю архитектуру проекта. Сейчас проводим нагрузочное тестирование, а заказчик наполняет портал контентом. Подробнее про проект и технологии, которые мы использовали, можно почитать здесь.

Одной из проблем, с которыми мы столкнулись в проекте, была реализация загрузки больших файлов на сервер. Мы изучили опыт других разработчиков и нашли интересное решение. В итоге выполнили задачу не превысив бюджет и сроки проекта.

В этой статье расскажем, как обрабатываем большие файлы.

Проблема: не всегда получается загрузить большие видео на сервер

Когда мы проводили промежуточное тестирование, выяснилось, что большие видео не всегда загружаются успешно. Причина в том, что файлы передаются через HTTP. Это стандартный протокол передачи данных между клиентской частью и сервером.

Сейчас HTTP используется для передачи любых данных, в том числе видео. Но изначально он был разработан для обмена гипертекстовыми документами — веб-страницами с текстом. Он рассчитан на обмен небольшими объемами информации: чем меньше файл, тем лучше все работает. Если мы загружаем несколько гигабайт видео, возникает целый ряд проблем.

При использовании HTTP сервер возвращает ответ только после полной загрузки файла. Соединение сбрасывается, если ответа долго нет — файл слишком большой, интернет слишком медленный или сигнал пропал. В этом случае файл приходится загружать заново: докачки такая реализация тоже не предусматривает. Когда нужно постоянно добавлять на сайт видео по 5—10 Гб, такой алгоритм не кажется надежным. Нужно было другое решение.

Решение: дробить файлы на фрагменты

Мы выбрали подход, который используют для обработки больших файлов опенсорсные облачные хранилища, такие как Nextcloud и Seafile. Они дробят видео на фрагменты по 10 Мб. У этого решения много плюсов и всего один небольшой минус.

Плюсы
  • Не нужно увеличивать лимиты передачи файлов на клиентской и серверной части
  • Не нужно увеличивать тайм-аут ожидания ответа сервера
  • Можно установить сторонние балансировщики соединения, их лимиты тоже не будут превышены
  • Появляется возможность докачки видео: если соединение пропало, загрузка продолжится с того фрагмента, на котором прервалась. Мы предусмотрели 3 попытки: при обрыве клиент ждет 1—2 секунды, потом пробует еще раз — и так 3 раза
Минусы
  • Незначительно увеличивается нагрузка на клиентскую часть, потому что ей надо не просто отдать данные серверу, а раздробить их на кусочки и отправить в нужной последовательности

У каждого фрагмента уникальный ID

Сотрудники компании могут одновременно добавлять видео со своих компьютеров через админку портала: один загружает урок по коррекции губ, другой — запись конференции, третий — мастер-класс. Если они назовут файлы одинаково, возникнет путаница: видео разделятся, фрагменты перемешаются, а потом соберутся неправильно. Чтобы этого не происходило, мы присваиваем каждому видео номер.

Чтобы части разных видео случайно не соединились в один файл, присваиваем файлу на стороне клиента уникальный ID

Фрагменты собирает скрипт

Так как теперь видео загружаются на сервер не целиком, а по частям, пришлось немного изменить логику обработки файлов. Сначала фрагменты попадают во временное хранилище, где специальный скрипт по уникальным ID соединяет их в нужной последовательности в первоначальное видео.

Ненужные фрагменты удаляются

Возможна ситуация, когда какая-то часть файла не загрузилась. Например, если надолго пропал интернет. Когда отсутствует хотя бы один фрагмент, нельзя собрать целый файл и отправить его на сервер. Эти фрагменты продолжают лежать и занимать место во временном хранилище. Поэтому мы написали скрипт, который раз в сутки чистит его от неполных файлов.

Скрипт, который удаляет не полностью загруженные файлы

Результат: большие файлы без проблем загружаются на видеопортал

Применяем такую схему передачи и хранения больших файлов:

  1. Пользователь загружает видео через админку портала.
  2. Клиентская часть дробит файл на фрагменты по 10 Мб, через HTTP-протокол передает их на сервер, во временное хранилище.
  3. Скрипт собирает из них исходный файл и отправляет его на дальнейшую обработку, например в модуль транскодирования.
  4. Для загруженных видео заказчик выделил систему хранения данных на 10 Тб. Когда место закончится, он сможет добавить еще.
Схема загрузки файлов на видеопортал

Плюсы решения для заказчика:

  • Можно загружать видеофайлы любого размера.
  • Можно использовать балансировщик — он не будет сбрасывать соединение.
  • Если соединение с сервером прервется на несколько секунд, файл все равно загрузится полностью.
  • Можно загружать несколько видео одновременно с разных устройств.

Получите ответ по смс

Ваше сообщение успешно отправлено!
Представьтесь пожалуйста
Укажите номер, на который придет ответ
Нажимая на кнопку, вы даете согласие
на обработку персональных данных.

Перезвонить вам, чтобы ответить на вопросы?

Когда с вами связаться?

Связаться по телефону:+7 499 321-59-32

Нажимая на кнопку, я принимаю условия политики и пользовательского соглашения

Фото эксперта
Дмитрий

Проектный менеджер

Получите ответ на ваш вопрос в любимом мессенджере

Выберите удобный мессенджер и начните диалог прямо сейчас

Telegram WhatsApp

Рассчитать стоимость проекта

Расскажите о вашем проекте, чтобы мы могли проконсультировать вас.

Напишите ваше имя
Укажите ваш email

Выберите удобный для вас способ связи

Мы сразу получим ваш запрос и поможем в решении проблемы

Написать в Telegram

Написать в WhatsApp

Позвонить нам