/ webtor.io / блог

Технологии внутри Webtor.io

29 Октября 2019

Периодически мои пользователи интересуются на каких технологиях основан Webtor, использую ли я библиотеку A или утилиту B. На этот раз я хочу развёрнуто и полно ответить на все вопросы.

Начну с того, что Webtor прошел путь длинной в 3 года от монолитного приложения, живущего на выделенном сервере, до внедрения микросервисов, контейнеризации и переезда в кластер Kubernetes (k8s). На текущий момент в кластере работает порядка 10-ти различных сервисов и одновременно выполняется 100+ одновременных задач по загрузке торрентов и транскодированию контента.

Далее пройдусь по часто задаваемым вопросам.

На чём написан Webtor?

Почти весь backend построен на Go. Справедливости ради первый прототип был на Node.js, но эта затея обернулась неудачей. Go позволил более эффективно использовать ресурсы и выдерживать большее количество пользователей. Можно сказать, что именно переход на Go и Kubernetes стали ключевыми техническими решениями для проекта. Для frontend-а был выбран Vue.js.

Как работает загрузка торрентов? Всё же на WebTorrent?

В отличии от многих других сервисов Webtor построен таким образом, чтобы максимально быстро предоставить доступ к контенту, не дожидаясь окончания загрузки. Контент сохраняется на диск только для кэширования и удаляется спустя 5 минут после последнего обращения. В качестве торрент-клиента используется библиотека на go anacrolix/torrent. Она предоставляет возможность последовательной загрузки и стримминга еще недозагруженного контента. Для каждой новой загрузки торрента запускается отдельный контейнер в кластере, это позволяет добиться максимальной изоляции процессов и высокой масштабируемости системы.

Для конвертации же используется FFmpeg, так ведь?

Начну немного издалека.

Здесь наверное меня ждало самое сложное испытание. Надо было дать пользователям возможность проигрывать еще незагруженные avi/mkv/flac-файлы также как они привыкли делать это ранее, с возможностью перемотки в нужную позицию, выбором субтитров и аудиодорожек. Каких-то готовых решений я не нашёл, пришлось придумывать свои велосипеды.

Итак как оно работает. Транскодирование начинается с определения длительности контента. На основании этой длительности формируется HLS-плейлист с указанием на еще несуществующие 10-ти секундные фрагменты. При обращении к какому-либо из этих фрагментов запускается процесс FFmpeg (да это он!) который начинает конвертировать необходимый отрезок (при этом загружается только необходимая часть торрента). Как только отрезок сконвертировался он отдаётся пользователю. Если вдруг пользователь перемотал на другой участок, то текущий процесс FFmpeg “засыпает”, а где-то запускается уже новый. Если пользователь вернулся обратно, то старый процесс находящийся по-близости “просыпается” и продолжает свою работу. В конце концов получается целое бесшовное видео. И да, каждая конвертация также запускается в отдельном контейнере.

В идеальных условиях, видео с невысоким разрешением (720p) и достаточным количеством пиров конвертируется без видимых задержек.

Я хочу установить Webtor на свой сервер, как мне это сделать?

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

Спасибо что используете webtor.io и поддержите проект!

👋 Ещё статьи из серии Что внутри