Коротко
-
01
Клиент
Сеть клиник пластической хирургии, выпускает нити для подтяжки кожи под собственным брендом
-
02
Задача
Загружать на сайт компании много видеозаписей в высоком качестве, независимо от скорости интернета и возможных обрывов связи
-
03
Решение
Дробить большие файлы на кусочки по 10 Мб, загружать их по отдельности, а потом собирать вместе
-
04
Результат
— Можно загружать видеофайлы любого размера
— Если соединение с сервером ненадолго прервется, файл все равно загрузится
— Можно загружать несколько видео одновременно с разных устройств
Чтобы обучать хирургов работе с продуктом, компания записывает видео
Компания занимается пластической хирургией, производит нити для подтяжки кожи под собственным брендом и продает их другим клиникам. Чтобы врачи активно использовали нити в своей практике, компания проводит обучение: авторские курсы, тренинги, интенсивы, вебинары. Все обучающие материалы доступны на бесплатном видеопортале.
В OrbitSoft компания обратилась с задачей обновить видеопортал. Сайт устарел, начал тормозить и выдавать ошибки. Например, страницы с видео долго загружались, система не выдерживала большой аудитории при онлайн-трансляциях.
Мы полностью переписали бэкенд и фронтенд портала, переделали структуру базы данных и всю архитектуру проекта. Сейчас проводим нагрузочное тестирование, а заказчик наполняет портал контентом. Подробнее про проект и технологии, которые мы использовали, можно почитать здесь.
Одной из проблем, с которыми мы столкнулись в проекте, была реализация загрузки больших файлов на сервер. Мы изучили опыт других разработчиков и нашли интересное решение. В итоге выполнили задачу не превысив бюджет и сроки проекта.
В этой статье расскажем, как обрабатываем большие файлы.
Проблема: не всегда получается загрузить большие видео на сервер
Когда мы проводили промежуточное тестирование, выяснилось, что большие видео не всегда загружаются успешно. Причина в том, что файлы передаются через HTTP. Это стандартный протокол передачи данных между клиентской частью и сервером.
Сейчас HTTP используется для передачи любых данных, в том числе видео. Но изначально он был разработан для обмена гипертекстовыми документами — веб-страницами с текстом. Он рассчитан на обмен небольшими объемами информации: чем меньше файл, тем лучше все работает. Если мы загружаем несколько гигабайт видео, возникает целый ряд проблем.
При использовании HTTP сервер возвращает ответ только после полной загрузки файла. Соединение сбрасывается, если ответа долго нет — файл слишком большой, интернет слишком медленный или сигнал пропал. В этом случае файл приходится загружать заново: докачки такая реализация тоже не предусматривает. Когда нужно постоянно добавлять на сайт видео по 5—10 Гб, такой алгоритм не кажется надежным. Нужно было другое решение.
Решение: дробить файлы на фрагменты
Мы выбрали подход, который используют для обработки больших файлов опенсорсные облачные хранилища, такие как Nextcloud и Seafile. Они дробят видео на фрагменты по 10 Мб. У этого решения много плюсов и всего один небольшой минус.
- Не нужно увеличивать лимиты передачи файлов на клиентской и серверной части
- Не нужно увеличивать тайм-аут ожидания ответа сервера
- Можно установить сторонние балансировщики соединения, их лимиты тоже не будут превышены
- Появляется возможность докачки видео: если соединение пропало, загрузка продолжится с того фрагмента, на котором прервалась. Мы предусмотрели 3 попытки: при обрыве клиент ждет 1—2 секунды, потом пробует еще раз — и так 3 раза
- Незначительно увеличивается нагрузка на клиентскую часть, потому что ей надо не просто отдать данные серверу, а раздробить их на кусочки и отправить в нужной последовательности
У каждого фрагмента уникальный ID
Сотрудники компании могут одновременно добавлять видео со своих компьютеров через админку портала: один загружает урок по коррекции губ, другой — запись конференции, третий — мастер-класс. Если они назовут файлы одинаково, возникнет путаница: видео разделятся, фрагменты перемешаются, а потом соберутся неправильно. Чтобы этого не происходило, мы присваиваем каждому видео номер.
Фрагменты собирает скрипт
Так как теперь видео загружаются на сервер не целиком, а по частям, пришлось немного изменить логику обработки файлов. Сначала фрагменты попадают во временное хранилище, где специальный скрипт по уникальным ID соединяет их в нужной последовательности в первоначальное видео.
Ненужные фрагменты удаляются
Возможна ситуация, когда какая-то часть файла не загрузилась. Например, если надолго пропал интернет. Когда отсутствует хотя бы один фрагмент, нельзя собрать целый файл и отправить его на сервер. Эти фрагменты продолжают лежать и занимать место во временном хранилище. Поэтому мы написали скрипт, который раз в сутки чистит его от неполных файлов.
Результат: большие файлы без проблем загружаются на видеопортал
Применяем такую схему передачи и хранения больших файлов:
- Пользователь загружает видео через админку портала.
- Клиентская часть дробит файл на фрагменты по 10 Мб, через HTTP-протокол передает их на сервер, во временное хранилище.
- Скрипт собирает из них исходный файл и отправляет его на дальнейшую обработку, например в модуль транскодирования.
- Для загруженных видео заказчик выделил систему хранения данных на 10 Тб. Когда место закончится, он сможет добавить еще.
Плюсы решения для заказчика:
- Можно загружать видеофайлы любого размера.
- Можно использовать балансировщик — он не будет сбрасывать соединение.
- Если соединение с сервером прервется на несколько секунд, файл все равно загрузится полностью.
- Можно загружать несколько видео одновременно с разных устройств.
Telegram
WhatsApp
+7 499 321-59-32
contact@orbitsoft.com