Кейс: как решили проблему загрузки больших файлов на видеопортал
Чтобы обучать хирургов работе с продуктом, компания записывает видео
Компания занимается пластической хирургией, производит нити для подтяжки кожи под собственным брендом и продает их другим клиникам. Чтобы врачи активно использовали нити в своей практике, компания проводит обучение: авторские курсы, тренинги, интенсивы, вебинары. Все обучающие материалы доступны на бесплатном видеопортале.
В OrbitSoft компания обратилась с задачей обновить видеопортал. Сайт устарел, начал тормозить и выдавать ошибки. Например, страницы с видео долго загружались, система не выдерживала большой аудитории при онлайн-трансляциях.
Мы полностью переписали бэкенд и фронтенд портала, переделали структуру базы данных и всю архитектуру проекта. Сейчас проводим нагрузочное тестирование, а заказчик наполняет портал контентом. Подробнее про проект и технологии, которые мы использовали, можно почитать здесь.
Одной из проблем, с которыми мы столкнулись в проекте, была реализация загрузки больших файлов на сервер. Мы изучили опыт других разработчиков и нашли интересное решение. В итоге выполнили задачу не превысив бюджет и сроки проекта.
В этой статье расскажем, как обрабатываем большие файлы.
Проблема: не всегда получается загрузить большие видео на сервер
Когда мы проводили промежуточное тестирование, выяснилось, что большие видео не всегда загружаются успешно. Причина в том, что файлы передаются через HTTP. Это стандартный протокол передачи данных между клиентской частью и сервером.
Сейчас HTTP используется для передачи любых данных, в том числе видео. Но изначально он был разработан для обмена гипертекстовыми документами — веб-страницами с текстом. Он рассчитан на обмен небольшими объемами информации: чем меньше файл, тем лучше все работает. Если мы загружаем несколько гигабайт видео, возникает целый ряд проблем.
При использовании HTTP сервер возвращает ответ только после полной загрузки файла. Соединение сбрасывается, если ответа долго нет — файл слишком большой, интернет слишком медленный или сигнал пропал. В этом случае файл приходится загружать заново: докачки такая реализация тоже не предусматривает. Когда нужно постоянно добавлять на сайт видео по 5—10 Гб, такой алгоритм не кажется надежным. Нужно было другое решение.
Решение: дробить файлы на фрагменты
Мы выбрали подход, который используют для обработки больших файлов опенсорсные облачные хранилища, такие как Nextcloud и Seafile. Они дробят видео на фрагменты по 10 Мб. У этого решения много плюсов и всего один небольшой минус.
У каждого фрагмента уникальный ID
Сотрудники компании могут одновременно добавлять видео со своих компьютеров через админку портала: один загружает урок по коррекции губ, другой — запись конференции, третий — мастер-класс. Если они назовут файлы одинаково, возникнет путаница: видео разделятся, фрагменты перемешаются, а потом соберутся неправильно. Чтобы этого не происходило, мы присваиваем каждому видео уникальный ID-номер.
Фрагменты собирает скрипт
Так как теперь видео загружаются на сервер не целиком, а по частям, пришлось немного изменить логику обработки файлов. Сначала фрагменты попадают во временное хранилище, где специальный скрипт по уникальным ID соединяет их в нужной последовательности в первоначальное видео.
Ненужные фрагменты удаляются
Возможна ситуация, когда какая-то часть файла не загрузилась. Например, если надолго пропал интернет. Когда отсутствует хотя бы один фрагмент, нельзя собрать целый файл и отправить его на сервер. Эти фрагменты продолжают лежать и занимать место во временном хранилище. Поэтому мы написали скрипт, который раз в сутки чистит его от неполных файлов.
Результат: большие файлы без проблем загружаются на видеопортал
Применяем такую схему передачи и хранения больших файлов:
- Пользователь загружает видео через админку портала.
- Клиентская часть дробит файл на фрагменты по 10 Мб, через HTTP-протокол передает их на сервер, во временное хранилище.
- Скрипт собирает из них исходный файл и отправляет его на дальнейшую обработку, например в модуль транскодирования.
- Для загруженных видео заказчик выделил систему хранения данных на 10 Тб. Когда место закончится, он сможет добавить еще.
Плюсы решения для заказчика:
- Можно загружать видеофайлы любого размера.
- Можно использовать балансировщик — он не будет сбрасывать соединение.
- Если соединение с сервером прервется на несколько секунд, файл все равно загрузится полностью.
- Можно загружать несколько видео одновременно с разных устройств.