Проблеми TypeScript у світі React-додатків вiд Iллi Климова на React fwdays | 27 березня
×Закрыть

Разработка видео и тестового чата. Советы, предложения

Доброго времени суток! Сейчас мне поставлена задача разработать видео и текстовый чат для одного сайта. Хотел бы поделиться своими мыслями и может кто-то сможет дать совет в каком направлении стоит двигаться.

Текстовый чат разработан на Node.js с использованием socket.io. Хотел бы узнать насколько масштабируемо и устойчиво такое решение при средней нагрузке 10к пользователей в день? Может есть какие-то другие решения.

Видео чат нужен без задержек, желательно realtime. Пока использую WebRTC PeerToPeer, 1 к 1. Но учитывая отсутствие пока полноценной поддержки WebRTC в Сафари и IE необходимо найти другое решение, кросс-браузерное, opensource, 1 ко многим. Удалось запустить связку WebRTC -> Kurento -> RTP -> FFMPEG -> NGINX-RTMP -> (RTMP, HLS, MPEG-DASH). Проблема этого решения заключается в необходимости использования flash-плееров, поддержка которых постепенно убирается из браузеров и невозможности использования для мобильных решений. Задержка HLS и MPEG-DASH слишком велика.

Из ещё возможных решений есть Jitsi Videobridge и Janus WebRTC Gateway, но опять же возникает вопрос масштабируемости решения и нагрузки на сервер.
Есть у кого-то опыт работы с этими системами или другие возможные решения?

Update. Всем спасибо кто отписался. Постараюсь раз в 1-2 недели писать как продвигается задача.

👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Для реализации чата я бы советовал посмотреть на Erlang или Elixir (elixir-lang.org). OTP (erlang.org/doc) как раз для таких задач сделан.

Пока использую WebRTC PeerToPeer, 1 к 1. Но учитывая отсутствие пока полноценной поддержки WebRTC в Сафари

А чего не хватает в Сафари? У них заявлено с 11 версии поддержка WebRTC есть, я не пробовал, интересно просто.

Из ещё возможных решений есть Jitsi Videobridge и Janus WebRTC Gateway, но опять же возникает вопрос масштабируемости решения и нагрузки на сервер.

Нагрузка на сервер выходит такая, если очень грубо: на одну FullHD камеру уходит одно ядро проца. Из-за перекодирования видео.

На хабре есть блог Flashphoner’а, много интересного про видео стриминг habrahabr.ru/company/flashphoner

Про 11 версию я с Вами согласен. Я имел ввиду, учитывая это caniuse.com/#search=webrtc, что поддержка пока не полная. Про перекодирование не совсем понял, в каком месте оно происходит, если связь идёт WebRTC PeerToPeer?

Вы же делаете видео чат, то есть может быть больше двух участников? Значит, все участники будут через сервер общаться. Скорее всего. Возможен, конечно, вариант когда все-со-всеми :) Но такое вряд ли подойдёт. Здесь подробнее
thenewdialtone.com/...​ng-webrtc-video-sessions
Если коротко, то одна из причин, что не все участники видео чата могут поддерживать одинаковые кодеки, поэтому на сервер ложится задача перекодирования.

Откуда цифра "

на одну FullHD камеру уходит одно ядро проца

"? Это Ваш практический опыт использования Kurento, Jitsi или Janus или Вы где-то это прочитали?

Это очень грубая оценка, сильно зависит от разрешения, качества видео, от самого проца. Например, здесь:
flashphoner.com/...​p-ip-kamery-s-ni/?lang=ru

При включении транскодинга, для каждой из подключенных IP-камер должна быть создана транскодинг-сессия, которая декодирует H.264 и кодирует в VP8. В этом случае 16 ядерный двухпроцессорный сервер сможет обслужить только 10-15 IP камер, из примерного расчета 1 камера на физическое ядро.

Из своего опыта пробовал Kurento сервер на обычном ноуте с i5, транслировал FullHD видео 30 fps из файла, цифр точно не помню, но нагрузка была точно не меньше 50% суммарно по процу. Поэтому пришлось отказаться от Kurento, потому что так и не получилось избежать перекодирования, даже если пир на другом конце поддерживал h264 (у меня не было задачи поддерживать разных клиентов с разными кодеками, нужен был только этот). Про эту проблему пишут на разных ресурсах, и ответа я так и не нашел github.com/...​ento-rtsp2webrtc/issues/8

Если вы хотите video on demand, то без флеша наверно не получится

Нужен live stream, а не vod.

Боюсь что сегодня именно с флешем не получится

Полно html5 vod плееров

Что касается текстового чата

при средней нагрузке 10к пользователей в день

Не особо важно сколько их за день, важны следующие пункты:

  • сколько в онлайне
  • сколько событий в секунду отправляется
  • география пользователей/серверов
  • каналы интернета у пользователей
  • c каких девайсов они сидят
  • есть ли в чате broadcast

Вроде как socket.io 2 уже получше, но до этого была боль.
Оно не масштабировалось (фактически масштабирование было, но скорее не работало), падало при онлайне <1к человек.
В итоге пришли к решению на sock.js.

Спасибо, попробую потестить sock.js.

Ну стоит смотреть/разбирать на запчасти как реализованы чаты во всяких эро-чатах и иже с ними — технически там очень всё на уровне.

Скрізь флеш, а це наче зовсім не те що шукає автор

Хром давно не дружит с флешем — так что там тоже давно перешли на HTML5

еро-чати на хтмл5 я ще не бачив(окрім однієї елітної дрочильні), чатурбейт/кам4/бонга — всі на флеші

Заодно впечатлишься разным нихера не совместимым WebRTC там где он типа реализован. А уж о степени реализации и то что в разных версиях одного и того же клиента он реализован по-разному...

Мой совет: откажись от задачи любым способом. Это попаболь адовая, и тебе точно платят меньше чем она стоит. Пусть купят готовое решение на стороне (и убедятся что такового не существует).

Посоветуйте это готовое решение на стороне, что бы и записывать видео умело и turn/stun сервер был.

Текстовый чат разработан на Node.js с использованием socket.io. Хотел бы узнать насколько масштабируемо и устойчиво такое решение при средней нагрузке 10к пользователей в день? Может есть какие-то другие решения.

Можна ще спробувати gitter.im

Подписаться на комментарии