Jak SignalR działa wewnętrznie?

160

Czy ktoś może dać mi znać, jak sygnalizujący działa wewnętrznie na wysokim poziomie?

Domyślam się, że opróżnia dane, Response.Flusha po stronie klienta wysyła żądania Ajax w określonych odstępach czasu. Czy to jest poprawne?

user960567
źródło
13
@dfowler przeprowadził niedawno wywiad ze Scottem Hanslemanem, który był bardzo pouczający hanselminutes.com/291/… .
Wyrównany
1
Dobry artykuł o architekturze sygnału r i jego działaniu lostechies.com/erichexter/2012/11/05/… asp.net/signalr/overview/getting-started/ ...
Mahesh
Wiem, że to dawno temu, ale microsoftvirtualacademy.com/Content/ ...
lordkain
1
Zobacz także tę prezentację na NDC 2013 Davida Fowlera i Damiana Edwardsa zatytułowaną „Pod okładkami z ASP.NET SignalR”, w której budują na żywo na scenie lite wersję SignalR. To bardzo pouczające. To wersja starsza niż 2.0, ale to nie powinno mieć większego znaczenia. vimeo.com/68383353
Johan B

Odpowiedzi:

241

Nie, sygnalizujący to abstrakcja w połączeniu. Zapewnia dwa modele programowania dla tego połączenia (koncentratory i połączenia trwałe). SignalR ma koncepcję transportów, każdy transport decyduje o sposobie wysyłania / odbierania danych oraz w jaki sposób łączy się i rozłącza.

SignalR ma kilka wbudowanych transportów:

  1. WebSockets
  2. Zdarzenia wysłane przez serwer
  3. Rama na zawsze
  4. Długie odpytywanie

SignalR próbuje wybrać „najlepsze” połączenie obsługiwane przez serwer i klienta (można również wymusić użycie określonego transportu).

To jest wysoki poziom. Jeśli chcesz zobaczyć, jak zaimplementowano każdy transport, możesz spojrzeć na kod źródłowy .

Istnieje również kod klienta dla każdego transportu: https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS

Jeśli zastanawiasz się, jak działa w szczególności transport z długimi ankietami:

Wysyła żądanie AJAX do serwera, który oczekuje asynchronicznie na odpowiedź sygnału. Gdy pojawi się sygnał lub żądanie przekroczy limit czasu, wraca z serwera i wysyła kolejne żądanie, a proces jest kontynuowany. (Zostawiłem kilka szczegółów na temat tego, jak klient śledzi to, co widział, aby nie przegapić wiadomości)

Mam nadzieję, że to odpowiada na większość Twoich pytań.

davidfowl
źródło
3
czy możesz mi powiedzieć, ile połączeń jest w stanie obsłużyć jednocześnie?
Farhad-Taran
1
Liczba połączeń, które sygnalizujący będzie obsługiwać, zależy od limitu żądań usług IIS. Można go zwiększyć za pomocą wpisów konfiguracyjnych lub skryptów powłoki. Zwykle Signalr buforuje w pamięci 1000 połączeń.
Thanigainathan
1
Jak już wspomniano, wzrost limitu jest na poziomie serwera. Damnien Edwards (współtwórca SignalR) ma jednak 150 000 połączeń z jednego serwera 10 GB: twitter.com/DamianEdwards/status/486642486350061568
LDJ
jakakolwiek odpowiedź na to pytanie stackoverflow.com/q/40906789/3565879
Technacron,
@davidfowl, proszę, odpowiedz na ten stackoverflow.com/questions/47504489/ ...
Hitesh Thakor
5

@davidfowl odpowiedział już na większą część. Jednakże, aby podać więcej szczegółów dotyczących różnic w zachowaniu transportów, w szczególności między WebSocket i innymi transportami; poniżej znajduje się kilka punktów.

  • WebSocket to jedyny transport, który ustanawia prawdziwe trwałe, dwukierunkowe połączenie między klientem a serwerem. Jednak WebSocket jest obsługiwany tylko przez IIS 8 lub nowszy oraz najnowsze wersje przeglądarek Internet Explorer, Google Chrome i Mozilla Firefox.
  • Podczas gdy zdarzenia wysłane przez serwer, zawsze ramka i odpytywanie długie, wszystkie trzy podążają za komunikacją jednokierunkową i są obsługiwane przez większość przeglądarek.
shivam
źródło