2013-09-16 11 views
17

Poszukuję rozwiązania cheapo do skalowania w czasie rzeczywistym dla wielu użytkowników w jednym kanale.WebRTC dla skalowania w czasie rzeczywistym

Używam sockjs, ale skalowanie jest dość irytujące, gdy mówimy o naprawdę dużych liczbach.

Zastanawiam się nad użyciem webrtc do obniżenia kosztów za pomocą p2p. Zamiast serwera łączącego się ze wszystkimi użytkownikami łączyłoby się ono tylko z ograniczoną liczbą użytkowników, którzy następnie dystrybuowaliby swoje dane do sieci p2p za pośrednictwem Webrtc. Czy to jest rozsądne? Jaki jest najłatwiejszy sposób wdrożenia?

Informacje nie są prywatne i kilka sekund < 5s opóźnienia jest dopuszczalne.

Odpowiedz

12

Tak, właśnie do tego służy webRTC: wymiana danych między przeglądarkami bez serwera. Aby to zadziałało, możesz pomyśleć o planie zarządzania na serwerze, który zarządza połączeniami (ponieważ jeden klient musi powiedzieć drugiemu klientowi "hej, jestem tutaj, połącz się ze mną ...") i zastanowić się, jakie elementy dane dotyczą klienta, kiedy klient musi połączyć się z kimś innym.

Jako wskazówka: Zrobiłem serwer w nodejs używając websockets (i wtyczki nodejs: 'ws') do komunikacji między klientami do czasu skonfigurowania RTC, aby mogli przesyłać dźwięk. Naprawdę łatwo jest zrobić wszystkie te rzeczy, ale trzeba udoskonalić.

Jak mogę przeczytać na podstawie twojego pytania, nie masz doświadczenia z korzystaniem z webRTC. Wystarczy dać fory, to jest właściwy porządek rzeczy, które muszą się wydarzyć dokonać 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! 

do wymiany tych danych połączeń moja rada jest, aby przejść z WebSocket. Obaj klienci otwierają websocket i kiedy tylko jeden klient coś wysyła, możesz wziąć połączenie websocket (to obiekt) od innego klienta i wysłać rzeczy. Korzystając z XHR, możesz pozwolić przeglądarce tylko połączyć się, poprosić o dane, a jeśli nie ma tam danych, spróbuj ponownie za x sekund.

suma: Używanie i konfigurowanie webRTC dla połączeń peer-to-peer jest dość łatwe, ale zarządzanie, kto będzie łączyć się z kim, będzie dużym kłopotem.

Edycja: Mój pomysł polegałby na tym, że pierwszy klient łączy się z serwerem i odbiera dane przez XHR lub websockets lub coś w tym stylu. Jeśli chcesz kompatybilność z przeglądarką, możesz chcieć iść z socket.io, ale to nie ma znaczenia, ponieważ tylko chrome i firefox obsługują webRTC (afaik). Następnie wystarczy połączyć się z przeglądarką do serwera. Jeśli planujesz posiadanie wielu giełd w tym samym czasie, identyfikator sesji będzie dość przydatny, abyś mógł po prostu wymienić to z osobami, które muszą go pobrać.

Po stronie serwera websockets zwraca obiekt "zawierający" bieżące połączenie. Więc jeśli klient 1 połączy się, przechowujesz go wewnątrz obiektu z identyfikatorem, który zrobiliśmy. Jeśli klient 2 połączy się, możesz go również zapisać. Następnie możesz po prostu wziąć obiekt websocket od pierwszego klienta i wykonać .send('your message').

Teraz naprawdę, jak bym to zrobił. Będę używał (ws) do określenia połączenia przez websocket, (http) dla żądania http i (rtc) dla webRTC. pc to twój obiekt połączenia równorzędnego: window.dc = new RTCDataChannel(ICEServers);. sdp oznacza SessionDescriptionProtocol,

  1. klient łączy się z serwerem i pobiera neccessarry plików (HTTP) (mam na myśli strony internetowej, skrypty i CSS, a nie plik, który chcesz udostępnić.)
  2. Klient żąda Nowa sesja. (ws)
  3. serwer tworzy instancję sesji wewnątrz obiektu.

    var sessID = Math.random(). ToString (36) .substring (12, 16);
    sesje [sessID] = {};

  4. Wysyłasz ten identyfikator sesji do klienta (ws), aby mógł wysłać to do innych osób (używając poczty itp.). Drugi użytkownik łączy się z serwerem (http) (ws), ale nie żąda identyfikatora, wysyła go.

  5. Po otrzymaniu serwera wysyła zarówno pierwszego klienta, jak i tego klienta wiadomość, że obie strony są gotowe. Klient wysyłający tworzy nowy obiekt webRTC i tworzy nową ofertę (przechowuje tę ofertę w dc.setLocalOffer (sdp)). Wysyła to na serwer (ws), a serwer wysyła go do klienta 2 (ws). Teraz klient przechowuje go przy użyciu dc.setRemoteDescription(sdp) i tworzy odpowiedź. (dc.createAnswer()), ustawia tę odpowiedź (dc.setLocalDescription(sdp). Ta odpowiedź jest wysyłana do klienta jednego. Teraz można użyć datachannel.

nie wiem jak datachannel exacly działa, jak mam dopiero working with PeerConnection, który jest szczególnie dla strumieni audio i wideo.Możesz użyć tego, aby dowiedzieć się, jak wykonać połączenie.Kod dla tego jest w my repo.W jest znacznie więcej kodu w środku, ponieważ jest to dla "profielwerkstuk" (niektóre elementy do szkoły, które zrobiłem z przyjacielem) .Teraz, które są interesujące dla ciebie, to server.js (jest to serwer nodejs używany do wymiany kandydatów na sdp i ICE). Strona jest w htdocs/mp.html (nie naprawdę interesujące), a fragment kodu javascript do zrobienia tego wszystkiego jest na htdocs/scripts/rtc.js.

Więcej informacji można zajrzeć do this example, a na explainments here

Jest już 'something you want' i używa dużo kodu aby było to możliwe. Należy również pamiętać, że stackoverflow to zadawanie pytań, a nie prosić o gotowy kod. Jeśli chcesz, spójrz na carreers 2.0 i znajdź kogoś, kto chce to dla ciebie zrobić.

Edycja 2: Teraz widzę twoją odpowiedź, myślę, że najlepszym sposobem, aby przejść, jest przechowywanie wszystkich połączeń wewnątrz tablicy wewnątrz obiektu sesji i przejście do połączenia klienta 1 -> 2, 2> 3, 3-> 4 itd. Ale również masz problemy z częściami i takimi. Zastanów się nad torrentami, połącz się z wieloma osobami i pobierz małe części z każdego. To jest naprawdę trudne, tak, i nie sądzę, że ktoś zrobił już coś tak dużego (poza Sharefest). Jeśli naprawdę chcesz to zrobić, musisz zrobić to samemu. Poświęć trochę czasu, aby pomyśleć o tym, jak rozwiązać ten problem, i użyj stackoverflow (lub innych witryn informacyjnych), aby znaleźć sposób na skonfigurowanie rtc i inne.

+0

Dzięki, podobała mi się ta odpowiedź! – Harry

+0

To jest szybka odpowiedź! Powiedz mi, jeśli chcesz wiedzieć więcej! Starałem się to wszystko zrozumieć, ale nie chcę, żeby inni to robili! – MarijnS95

+0

Widzę, że dodałeś nawet nagrodę. Czy ta odpowiedź nie była wystarczająco kompletna (ponieważ nie ma tam naprawdę "ulepszających pytanie" zmian dotyczących tego, co chcesz teraz wiedzieć, przeczytałeś te odpowiedzi), czy chcesz bardziej dopracowanej odpowiedzi? – MarijnS95

-1

Tak, to bardzo rozsądne, WEBRTC to kolejna największa rzecz, jeśli chodzi o komunikację w czasie rzeczywistym! To, co sprawia, że ​​jest tak rozsądne, jest zrobione w JavaScript. Rozrasta się o miliony i jest obsługiwany na wielu platformach w miarę upływu czasu. Jest to niski koszt & wysokiej jakości!

Nie jestem tu po to, aby cię rozwalić czy coś, ale webrtc wysadza Węzeł z wody każdego dnia.

Wybierz WebRTC, wiesz chcesz;)

+0

Nie wiem, w jaki sposób chciałbym odciąć węzeł, ponieważ nadal potrzebujesz serwera do wymiany danych w celu ustanowienia połączenia w czasie rzeczywistym, a nodejs jest do tego idealny. Działają razem jak urok, aby wymieniać opisy sesji i kandydatów do egzaminu ICE za pośrednictwem sieci Web. – MarijnS95

+0

Nie jestem tu po to, aby cię rozwalić, czy coś, ale ziemniaki wysadzają traktory z wody każdego dnia. – Brad

4

całkowicie sensowne.

WebRTC to sieciowe sieci P2P o niskim opóźnieniu w przeglądarce. Jeśli przeglądarka użytkownika obsługuje funkcję DataChannel, możesz użyć biblioteki takiej jak WebTorrent https://github.com/feross/webtorrent.

Zobacz także implementację Sharefest: https://www.sharefest.me/ jest bardzo podobny do idei, której szukasz.

Aby rozpocząć, zapoznaj się z samouczkiem HTML5 Rocks WebRTC: http://www.html5rocks.com/en/tutorials/webrtc/basics/. Również biblioteka SimpleWebRTC jest bardzo przydatna: http://simplewebrtc.com/

+0

Oh sharefest jest open source. Słodkie, dzięki! – Harry

Powiązane problemy