Алексей Акулович Backend разработчик ВКонтакте · Сквозь...

60
Сквозь тернии к своей платформе live трансляций Алексей Акулович Backend разработчик ВКонтакте 2017.06.15#3

Transcript of Алексей Акулович Backend разработчик ВКонтакте · Сквозь...

Page 1: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Сквозь тернии к своей платформеlive трансляций

Алексей Акулович Backend разработчик ВКонтакте

2017.06.15#3

Page 2: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Чем я вообще занимаюсь?

Multimedia backend:

Видео Пуши

Фотографии Истории

Аудио Голосовые сообщения

Документы Live трансляции

Page 3: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

План

История и требования

Какие решения пробовали, плюсы и минусы

Архитектура сейчас

Что было, есть и планируется

Page 4: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Один стримит

(Очень) много смотрят

Небольшая задержка

Live трансляции

Page 5: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Предыстория

Использовали стороннее решение

Встраиваемый плеер

Единичные трансляции

Большая задержка

Page 6: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Задержка сигнала

Захват

Кодирование

Передача

Декодирование

Отображение

Пост на тему https://habrahabr.ru/post/265675/

Page 7: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Протокол передачи

Минимальные задержки

RTMP

RTSP

Ощутимые задержки

HLS

DASH

Page 8: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Варианты использования

Контроль Задержка Обработка

Наши приложения

ЕСТЬ МИНИМАЛЬНАЯ НЕ НУЖНА

Сторонний софт

НЕТ НЕ ИЗВЕСТНО НУЖНА

Page 9: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Протокол передачи

Без обработки

RTMP

С обработкой / fallback

HLS

Page 10: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

План

История и требования

Какие решения пробовали, плюсы и минусы

Архитектура сейчас

Что было, есть и планируется

Page 11: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Медиа серверы

Red5

Erlyvideo/Flussonic

Wowza

nginx rtmp module *

Page 12: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Red5

Субъективно “как Wowza, только хуже”

Не лучшие отзывы от тех, кто пробовал ранее

Не стали тестить. Вот такие мы ненаучные :)

Page 13: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Erlyvideo/Flussonic

Отечественная команда

Не заинтересовались сотрудничеством

Мы не стали рисковать

Page 14: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Wowza

Очень популярная

Использовалась в дружественном проекте

Взяли на тесты

Page 15: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Wowza - плюсы

Много всего умеет

Page 16: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Wowza - минусы

“Форум-ориентированное” конфигурирование

Page 17: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Wowza - минусы

“Форум-ориентированное” конфигурирование

Ехал XML через XML

Page 18: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Wowza - минусы

“Форум-ориентированное” конфигурирование

Ехал XML через XML

Для callback нужно писать модуль на Java

Page 19: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Wowza - совсем минусы

Уже на тестах свопила машину (16G RAM + 4G SWAP)

Page 20: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Wowza - совсем минусы

Уже на тестах свопила машину (16G RAM + 4G SWAP)

Иногда битые записи при реконнектах стримеров

Page 21: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer

Page 22: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer

Отечественная команда

Заинтересовались сотрудничеством

Нужные нам фичи уже были в их планах

Была своя клиентская либа для iphone/android

Сервер написан на C++

Page 23: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer

Бинарник самого сервера (бесплатно)

so’шка транскодера (платно)

Внешняя панель для управления и API (платно)

Page 24: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - панель управления

Page 25: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - панель управления

Page 26: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - плюсы

Интерфейс панели

Потребление ресурсов cpu/mem

API для настройки и получения состояния

Панель+транскодер стоят дешевле Wowza

Page 27: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы

Минусы… Минусы никуда не деваются.

Page 28: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - m3u8

$ curl https://site.com/playlist.m3u8#EXTM3Uhttps://site.com/chunks.m3u8$ curl https://site.com/chunks.m3u8#EXTM3Uchunk0.tschunk1.ts<...>$ curl https://site.com/chunk0.ts<...>

Page 29: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - m3u8

$ curl https://site.com/playlist.m3u8#EXTM3Uhttp://site.com/chunks.m3u8

nginx.conf:sub_filter 'http://site.com' 'https://site.com;sub_filter_once on;sub_filter_types 'application/vnd.apple.mpegurl';

Page 30: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - API

Запросы к стороннему домену API

Page 31: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - API

Запросы к стороннему домену API

Доступ по whitelist с отдельными IP (без подсетей)

Page 32: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - API

Запросы к стороннему домену API

Доступ по whitelist с отдельными IP (без подсетей)

Nimble синхронизируется с API время от времени

Page 33: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - API

Запросы к стороннему домену API

Доступ по whitelist с отдельными IP (без подсетей)

Nimble синхронизируется с API время от времени

Docker + nginx tcp proxy + hosts

Page 34: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - API

Запросы к стороннему домену API

Доступ по whitelist с отдельными IP (без подсетей)

Nimble синхронизируется с API время от времени

Docker + nginx tcp proxy + hosts

Настраивается не всё

Page 35: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - ABR

Page 36: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - ABR

Page 37: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Nimble Streamer - минусы - DVR

Один источник стрима => один диск

“Нет” медленным дискам для архива

Page 38: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

План

История и требования

Какие решения пробовали, плюсы и минусы

Архитектура сейчас

Что было, есть и планируется

Page 39: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура

рабочийстример зрительRTMP RTMP

HLS

Page 40: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - входящий стрим

входящийстример рабочийRTMP RTMP

зритель

RTMPHLS

Page 41: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - входящий стрим

Внутренности

nginx rtmpстример рабочийRTMP RTMP

https://github.com/arut/nginx-rtmp-module

Page 42: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - входящий стрим

rtmp { application myapp { live on; on_publish http://localhost:8080/remote_redirect; notify_method get; }}http { location /remote_redirect { rewrite ^.*$ rtmp://1.2.3.4/app/$arg_name? permanent; }}

https://github.com/arut/nginx-rtmp-module/wiki/Directives#on_play

Page 43: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - входящий стрим

Внутренности

nginx rtmpnginx rtmpстримерRTMP

Page 44: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - раздача

Внутренности

раздающийрабочий зритель

RTMPHLS

RTMPHLS

Page 45: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - раздача

Внутренности

nginx зритель

RTMPHLS

RTMP: nginx-rtmp-moduleHLS: proxy_cache в tmpfs

Page 46: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - раздача

Внутренности

nginx зритель

RTMPHLS

Page 47: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - раздача

рабочий

рабочий

раздающий

раздающий

раздающий

раздающийВнутренности

зритель

зритель

зритель

зритель

Page 48: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - раздача

рабочий

рабочий

раздающий

раздающий

раздающий

раздающий

раздающий

раздающий

раздающий зрительВнутренности

зритель

зритель

зритель

Page 49: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - раздача

рабочий

рабочий

раздающий

раздающий

раздающий

раздающий

раздающий

раздающий

раздающий зрительВнутренности

зритель

зритель

зритель

Page 50: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - раздача

раздающий

демон

раздающий

демон

раздающий

демонВнешний раздающий слой

Внутренний раздающий слой

Page 51: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура - раздача

$ curl -v https://site1.com/stream_name< HTTP/1.1 302 Moved Temporarily< Location: rtmp://site1.com/stream_name

$ curl -v https://site1.com/stream_name< HTTP/1.1 302 Moved Temporarily< Location: https://site2.com/stream_name

Page 52: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Архитектура

входящийвходящийрабочий

рабочий

раздающий

раздающий

раздающий

раздающий

раздающий

раздающий

стример зритель

Внутренности

раздающий

Page 53: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

План

История и требования

Какие решения пробовали, плюсы и минусы

Архитектура сейчас

Что было, есть и планируется

Page 54: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Что было

Dota2 The International в августе 2016 — 24к

Dota2 The Boston Major в декабре 2016 — 26к

Нелегальные футбольные матчи — 34к

Взрыв в метро — 54к

Лига чемпионов в июне 2017 - 240Гб/сек

Page 55: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Что есть

200к новых стримов в день (пик 480к)

9-14кк просмотров в день (пик 22кк)

Page 56: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Что есть

Хранятся записи всех лайвов

Page 57: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Что есть

Есть “бесконечные” стримы

Сейчас ~35 штук

Page 58: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Что есть

Несколько патченный nginx rtmp module (open source?)

Page 59: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Что планируется

Расшириться до 1кк зрителей (~3Тб/сек)

Полностью избавиться от машин без SSD

Вероятно, отказаться от Nimble в пользу велосипеда

Page 60: Алексей Акулович Backend разработчик ВКонтакте · Сквозь тернии к своей платформе live трансляций Алексей

Вопросы?

https://vk.com/ac

[email protected]