WebRTC для масштабирования в реальном времени

Я ищу решение cheapo для масштабирования в реальном времени для многих пользователей в 1 канале.

Я использую sockjs, но масштабирование довольно раздражает, когда речь идет о действительно больших числах.

Я думаю об использовании webrtc для снижения стоимости с помощью p2p. Вместо того, чтобы сервер подключался ко всем пользователям, он подключался только к ограниченному числу пользователей, которые затем распределяли свои данные в сеть p2p через webrtc. Это разумно? Какой самый простой способ реализовать?

Информация не является конфиденциальной, и может потребоваться несколько секунд < 5s задержки.

Ответ 1

Да, это то, что webRTC для: обмена данными между браузерами без сервера. Чтобы выполнить эту работу, вы можете подумать о каком-то плане управления на сервере, который управляет соединениями (поскольку одному клиенту нужно сообщить другому клиенту "эй, я здесь, подключись ко мне..." ) и подумать о том, какие части данные находятся на том клиенте, когда клиент должен подключиться к кому-то другому.

В качестве подсказки: я сделал сервер в nodejs, используя websockets (и nodejs plugin: 'ws') для связи между клиентами до тех пор, пока RTC не будет настроен, чтобы они могли передавать аудио. Это действительно легко сделать все это, но боль для уточнения.

Как я могу прочитать из вашего вопроса, у вас нет опыта использования webRTC. Чтобы дать вам начало, это правильный порядок вещей, которые должны произойти, чтобы сделать RTC:

Client 1                        Server       Client 2
Create an RTC object
Create offer
set localdescription = offer                 Create RTC object                   
send offer ------------------->       ------>set remote description to offer
                                             Create answer
                                             local description = answer
set remote description<--------       <------send answer

This goes both directions:
onicecandidate send ---------->       ------>set ICE candidate

Connection done!

Для обмена данными соединения мой совет - пойти с websockets. Оба клиента открывают websocket, и каждый раз, когда один клиент отправляет что-то, вы можете подключить веб-соединение (это объект) от другого клиента и отправить вещи. Используя XHR, вы можете разрешить браузеру подключаться, запрашивать данные, а если данные не повторены за х секунд.

sum: Использование и настройка webRTC для одноранговых соединений довольно просто, но управление тем, кто будет подключаться к тому, кто будет много неприятностей.

Изменить: Моя идея состояла бы в том, чтобы первый клиент подключался к серверу и получал его данные либо с помощью XHR, либо с веб-узлов или что-то в этом роде. Если вы хотите совместимость с браузером, вы можете пойти с socket.io, но это не имеет особого значения, поскольку только хром и firefox поддерживают webRTC (afaik). Затем вы просто подключаетесь из своего браузера к разъему. Если вы планируете иметь несколько обменов на одном и том же идентификаторе сеанса, это будет довольно удобно, так что вы можете просто обменять это с людьми, которые должны их загрузить.

На стороне сервера веб-серверы возвращают объект, содержащий "текущее соединение". Поэтому, если клиент 1 будет подключаться, вы храните его внутри объекта с идентификатором, который мы создали. Если клиент 2 подключится, вы также можете сохранить это. Затем вы можете просто взять объект websocket с первого клиента и сделать .send('your message').

Теперь на самом деле, как бы я это сделал. Я буду использовать (ws) для определения соединения через websocket, (http) для http-запроса и (rtc) для webRTC. pc - это ваш объект соединения со сверстниками: window.dc = new RTCDataChannel(ICEServers);. sdp означает SessionDescriptionProtocol,

  • Клиент подключается к вашему серверу и загружает файлы neccessarry (http) (я имею в виду веб-страницу, скрипты и css, а не файл, который вы хотите разделить).
  • Клиент запрашивает новый сеанс. (WS)
  • сервер создает экземпляр сеанса внутри объекта.

    var sessID = Math.random(). toString (36).substring(12, 16);
    сеансы [sessID] = {};

  • Вы отправляете этот идентификатор сеанса клиенту (ws), чтобы он мог отправлять его другим людям (используя почту и т.д.). Другой пользователь подключается к серверу (http) (ws), но не запрашивает идентификатор, он отправляет его.

  • Когда сервер получает это, он отправляет как клиенту, так и клиенту сообщение, в котором обе стороны готовы. Отправляющий клиент создает новый объект webRTC и создает новое предложение (он сохраняет это предложение в dc.setLocalOffer(sdp)). Он отправляет это серверу (ws), и сервер отправляет его клиенту 2 (ws). Теперь клиент сохраняет его с помощью dc.setRemoteDescription(sdp) и создает ответ. (dc.createAnswer()) задает этот ответ (dc.setLocalDescription(sdp)). Этот ответ отправляется клиенту. Теперь вы можете использовать datachannel.

Я не знаю, как работает datachannel exacly, поскольку я только работал с PeerConnection, что особенно касается аудио- и видеопотоков. Вы можете использовать это, чтобы узнать, как установить соединение. Код для этого находится в моем репо. Внутри есть намного больше кода, поскольку это для "profielwerkstuk" (некоторая заготовка для школы, которую я сделал с другом). То, что вам интересно посмотреть, - server.js(это сервер nodejs, используемый для обмена кандидатами на sdp и ICE). Веб-страница находится в htdocs/mp.html(не очень интересно), и часть кода javascript для этого всего находится на htdocs/scripts/rtc.js.

Для получения дополнительной информации вы можете посмотреть этот пример и в здесь объяснениях

Уже есть что-то, что вы хотите, и он использует много кода, чтобы сделать это возможным. Также обратите внимание, что stackoverflow должен задавать вопросы, а не запрашивать готовый код. Если вы хотите этого, взгляните на carreers 2.0 и найдите того, кто хочет сделать это за вас.

Изменить 2: Теперь я вижу ваш ответ, я думаю, что лучший способ - сохранить все соединения внутри массива внутри вашего объекта сеанса и пойти для подключения клиента 1 → 2, 2- > 3, 3- > 4 и т.д. Но хорошо то у вас есть проблемы с деталями и т.д. Подумайте о торрентах, где вы подключаетесь к нескольким людям и загружаете небольшие части из каждого. Это действительно сложно, да, и я не думаю, что кто-то уже сделал что-то такое большое (помимо sharefest). Если вы действительно хотите это сделать, вам нужно будет самому самому. Потратьте некоторое время, чтобы подумать о том, как вы это решите, и используйте stackoverflow (или другие информационные сайты), чтобы посмотреть, как настроить rtc и т.д.

Ответ 2

Полностью разумный.

WebRTC представляет собой сеть с низкой задержкой P2P в браузере. Если браузер пользователя поддерживает DataChannel, вы можете использовать библиотеку, такую ​​как WebTorrent https://github.com/feross/webtorrent.

Также посмотрите на реализацию Sharefest: https://www.sharefest.me/ он очень похож на ту идею, которую вы ищете.

Чтобы начать работу, ознакомьтесь с учебным пособием по HTML5 Rocks WebRTC: http://www.html5rocks.com/en/tutorials/webrtc/basics/. Также очень удобна библиотека SimpleWebRTC: http://simplewebrtc.com/

Ответ 3

Да, это очень разумно, WEBRTC - это следующая самая большая вещь, когда дело касается общения в реальном времени! Что делает его настолько разумным, так это то, что это сделано в Javascript. Он растет миллионами и поддерживается на многих других платформах с течением времени. Это низкая стоимость и высокое качество!

Я не здесь, чтобы bash вы или что-то в этом роде, но webrtc удаляет Node из воды в любой день.

Выберите webrtc, вы знаете, что хотите;)