¿Cómo funciona internamente SignalR?

160

¿Alguien puede decirme cómo funciona SignalR internamente de una manera de alto nivel?

Supongo que está vaciando los datos usando Response.Flushy en el lado del cliente está enviando solicitudes de Ajax a ciertos intervalos. ¿Es correcto?

usuario960567
fuente
13
@dfowler hizo una entrevista con Scott Hansleman recientemente que fue muy informativa hanselminutes.com/291/… .
Alineado el
1
Buen artículo sobre la arquitectura de la señal r y cómo funciona lostechies.com/erichexter/2012/11/05/… asp.net/signalr/overview/getting-started/…
Mahesh
Sé que es hace mucho tiempo pero microsoftvirtualacademy.com/Content/…
lordkain
1
También vea esta presentación en NDC 2013 de David Fowler y Damian Edwards llamada 'Under the covers with ASP.NET SignalR' donde construyen una versión lite de SignalR en vivo en el escenario. Es muy informativo Es pre 2.0 pero eso no debería importar mucho. vimeo.com/68383353
Johan B

Respuestas:

241

No, SignalR es una abstracción sobre una conexión. Le ofrece dos modelos de programación a través de esa conexión (concentradores y conexiones persistentes). SignalR tiene un concepto de transporte, cada transporte decide cómo se envían / ​​reciben los datos y cómo se conecta y desconecta.

SignalR tiene algunos transportes integrados:

  1. WebSockets
  2. Eventos enviados por el servidor
  3. Marco para siempre
  4. Sondeo largo

SignalR intenta elegir la "mejor" conexión compatible con el servidor y el cliente (también puede forzarla a utilizar un transporte específico).

Ese es el alto nivel. Si desea ver cómo se implementa cada transporte, puede consultar el código fuente .

También hay un código de cliente para cada transporte: https://github.com/SignalR/SignalR/tree/master/src/Microsoft.AspNet.SignalR.Client.JS

Si está preguntando cómo funciona el transporte de sondeo largo en particular:

Envía una solicitud ajax al servidor que está esperando asincrónicamente una señal para responder. Cuando hay una señal o el tiempo de espera de la solicitud, vuelve del servidor y envía otra solicitud y el proceso continúa. (Dejé algunos detalles sobre cómo el cliente realiza un seguimiento de lo que vio para que no pierda mensajes)

Esperemos que eso responda la mayor parte de su pregunta.

davidfowl
fuente
3
¿Me puede decir cuántas conexiones puede soportar a la vez?
Farhad-Taran
1
En cuanto a cuántas conexiones admitirá el Signalr depende del límite de solicitud del IIS. Se puede aumentar utilizando entradas de configuración o scripts de shell. Por lo general, Signalr almacena en caché 1000 conexiones en la memoria.
Thanigainathan
1
Como ya se mencionó, la concentración límite está en el nivel del servidor. Sin embargo, Damnien Edwards (cocreador de SignalR) tiene 150,000 conexiones de un solo servidor de
10GB
cualquier respuesta a esta pregunta stackoverflow.com/q/40906789/3565879
Technacron
@davidfowl, por favor, responda para este stackoverflow.com/questions/47504489/…
Hitesh Thakor
5

@davidfowl ya ha respondido la mayor parte. Sin embargo, para proporcionar más detalles sobre la diferencia en el comportamiento de los transportes, específicamente entre WebSocket y otros transportes; a continuación hay algunos puntos.

  • WebSocket es el único transporte que establece una verdadera conexión bidireccional persistente entre el cliente y el servidor. Sin embargo, WebSocket solo es compatible con IIS 8 o superior, y las últimas versiones de Internet Explorer, Google Chrome y Mozilla Firefox.
  • Mientras que Server Send Events, Forever Frame y Long sondeo, los tres siguen una comunicación unidireccional y son compatibles con la mayoría de los navegadores.
shivam
fuente