tutorial net mvc example asp.net-mvc-4 asynchronous signalr

asp.net mvc 4 - net - ¿Los métodos del lado del servidor de Signalr deben ser asíncronos al llamar a los Clientes?



signalr tutorial (1)

Estoy siguiendo el "Tutorial de SignalR" en: http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server

Así que asumamos este simple método de chat:

public void Send(string name, string message) { // Call the addNewMessageToPage method to update clients. Clients.All.addNewMessageToPage(name, message); }

Supongamos que tengo una sala de chat con 50 000 usuarios. ¿Habría algún beneficio de cambiar el método de envío para que sea asíncrono, como esto:

public async Task Send(string name, string message) { // Call the addNewMessageToPage method to update clients. await Clients.All.addNewMessageToPage(name, message); }

  • ¿IIS mantendrá la Solicitud actual (del usuario que publicó el chat) y esperará hasta que se notifique a todos los clientes?
  • ¿La llamada a "Cliente" es totalmente asíncrona bajo el capó y la solicitud se libera en este momento?

¡Gracias!


La única razón por la que debe esperar la tarea es cuando está utilizando el escalado. De forma predeterminada, el bus de mensajes en la memoria devuelve una tarea completada porque la operación es tan rápida que no tiene sentido hacerlo asíncrono, pero puede hacerlo si lo desea. Para responder tu pregunta:

  • No enviamos a los clientes en la misma pila de llamadas haciendo la invocación del método (por ejemplo, Clients.All.addNewMessage no espera nada excepto la publicación en el bus de mensajes). Ningún subproceso de solicitud esperará a que los clientes reciban nada (no admitimos que el cliente reciba el mensaje en SignalR para las invocaciones normales).

  • Siempre es asíncrono, incluso si no usa esperar en el sitio de la llamada. Tenemos un intermediario de mensajes que realmente hace la escritura a los clientes. Cuando llamas a ese método, solo estás poniendo un mensaje en un búfer. En algún momento en el futuro, ese mensaje se entrega a los clientes.

En el escenario de escalado, llamar a un método cliente envía un mensaje a un servicio externo (sql, redis, bus de servicio) y puede fallar, por lo que debe esperar la tarea para observar las excepciones.

Espero que ayude