Escalabilidad horizontal de SignalR con Azure Service Bus
por Patrick Fletcher
Advertencia
Esta documentación no se aplica a la última versión de SignalR. Eche un vistazo a ASP.NET Core SignalR.
En este tutorial, implementará una aplicación SignalR en un rol web de Microsoft Azure mediante el backplane de Service Bus para distribuir mensajes a cada instancia de rol. (También puede usar el backplane de Service Bus con aplicaciones web en Azure App Service.)
Requisitos previos:
- Una cuenta de Microsoft Azure.
- SDK de Microsoft Azure.
- Visual Studio 2012 o 2013
El backplane de Service Bus también es compatible con Service Bus para Windows Server, versión 1.1. Sin embargo, no es compatible con la versión 1.0 de Service Bus para Windows Server.
Precios
El backplane de Service Bus usa temas para enviar mensajes. Para obtener la información de precios más reciente, consulte Service Bus. En el momento de redactar este documento, puede enviar 1 millón de mensajes al mes por menos de 1 USD. El backplane envía un mensaje de Service Bus para cada invocación de un método de centro SignalR. También hay algunos mensajes de control para conexiones, desconexiones, unión o salida de grupos, etc. En la mayoría de las aplicaciones, la mayor parte del tráfico de mensajes serán invocaciones del método de centro.
Información general
Antes de pasar al tutorial detallado, aquí tiene una rápida introducción a lo que va a hacer.
Use el portal de Microsoft Azure para crear un nuevo espacio de nombres de Service Bus.
Agregue estos paquetes NuGet a su aplicación:
Cree una aplicación de SignalR.
Agregue el siguiente código a Startup.cs para configurar el backplane:
public void Configuration(IAppBuilder app) { string connectionString = "Service Bus connection string"; GlobalHost.DependencyResolver.UseServiceBus(connectionString, "YourAppName"); app.MapSignalR(); // ... }
Este código configura el backplane con los valores predeterminados de TopicCount y MaxQueueLength. Para más información sobre cómo cambiar estos valores, consulte Rendimiento de SignalR: métricas de escalabilidad horizontal.
Para cada aplicación, elija otro valor para "YourAppName". No use el mismo valor en varias aplicaciones.
Creación de los servicios de Azure
Cree un servicio en la nube, como se describe en Creación e implementación de un servicio en la nube. Siga los pasos descritos en la sección "Creación de un servicio en la nube mediante Creación rápida". En este tutorial, no es necesario cargar un certificado.
Cree un nuevo espacio de nombres de Service Bus, como se describe en Uso de temas o suscripciones de Service Bus. Siga los pasos de la sección "Crear un espacio de nombres de servicio".
Nota:
Asegúrese de seleccionar la misma región para el servicio en la nube y el espacio de nombres de Service Bus.
Creación del proyecto de Visual Studio
Inicie Visual Studio. En el menú Archivo, haga clic en Nuevo proyecto.
En el cuadro de diálogo Nuevo proyecto, expanda Visual C#. En Plantillas instaladas, seleccione Nube y, a continuación, Servicio en la nube de Microsoft Azure. Mantenga el valor predeterminado de .NET Framework 4.5. Asigne a la aplicación el nombre ChatService y haga clic en Aceptar.
En el cuadro de diálogo Nuevo servicio en la nube de Microsoft Azure, seleccione el rol web de ASP.NET. Haga clic en el botón de flecha derecha (>) para agregar el rol a la solución.
Mantenga el mouse sobre el nuevo rol para que el icono de lápiz esté visible. Haga clic en este icono para cambiar el nombre del rol. Asigne al rol el nombre "SignalRChat" y haga clic en Aceptar.
En el cuadro de diálogo Nuevo proyecto ASP.NET, seleccione MVC y haga clic en Aceptar.
El asistente para proyectos crea dos proyectos:
- ChatService: este proyecto es la aplicación de Microsoft Azure. Define los roles de Azure y otras opciones de configuración.
- SignalRChat: este proyecto es el proyecto de ASP.NET MVC 5.
Creación de la aplicación de chat de SignalR
Para crear la aplicación de chat, siga los pasos del tutorial Introducción a SignalR y MVC 5.
Use NuGet para instalar las bibliotecas necesarias. En el menú Herramientas, seleccione Administrador de paquetes NuGet y, a continuación, Consola del administrador de paquetes. En la ventana Consola del administrador de paquetes, escriba los comandos siguientes:
Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR
Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR.ServiceBus
Use la opción -ProjectName
para instalar los paquetes en el proyecto ASP.NET MVC, en lugar del proyecto de Microsoft Azure.
Configuración del backplane
En el archivo Startup.cs de la aplicación, agregue el código siguiente:
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
string connectionString = "";
GlobalHost.DependencyResolver.UseServiceBus(connectionString, "Chat");
app.MapSignalR();
}
Ahora debe obtener la cadena de conexión de Service Bus. En Azure Portal, seleccione el espacio de nombres de Service Bus que ha creado y haga clic en el icono Clave de acceso.
Copie la cadena de conexión en el Portapapeles y péguela en la variable connectionString.
string connectionString = "Endpoint=sb://xxxx.servicebus.windows.net/;
SharedSecretIssuer=owner;SharedSecretValue=XXXXXXXX";
Implementación en Azure
En el Explorador de soluciones, expanda la carpeta Roles dentro del proyecto ChatService.
Haga clic con el botón derecho en el rol SignalRChat y seleccione Propiedades. Seleccione la pestaña Configuración. En Instancias, seleccione 2. También puede establecer el tamaño de la máquina virtual en Extra pequeña.
Guarde los cambios.
En el Explorador de soluciones, haga clic con el botón derecho en el proyecto ChatService. Seleccione Publicar.
Si esta es la primera vez que publica en Microsoft Azure, debe descargar sus credenciales. En el asistente para Publicación, haga clic en "Iniciar sesión para descargar credenciales". Se le pedirá que inicie sesión en el portal de Microsoft Azure y descargue un archivo de configuración de publicación.
Haga clic en Importar y seleccione el archivo de configuración de publicación que ha descargado.
Haga clic en Next. En el cuadro de diálogo Configuración de publicación, en Servicio en la nube, seleccione el servicio en la nube que ha creado anteriormente.
Haga clic en Publicar. La implementación de la aplicación puede tardar unos minutos en iniciar las máquinas virtuales.
Ahora, al ejecutar la aplicación de chat, las instancias de rol se comunican mediante Azure Service Bus mediante un tema de Service Bus. Un tema es una cola de mensajes que permite varios suscriptores.
El backplane crea automáticamente el tema y las suscripciones. Para ver las suscripciones y la actividad de mensajes, abra Azure Portal, seleccione el espacio de nombres de Service Bus y haga clic en "Temas".
La actividad del mensaje tarda unos minutos en aparecer en el panel.
SignalR administra la duración del tema. Siempre que esté implementada la aplicación, no intente eliminar manualmente temas ni cambiar la configuración del tema.
Solución de problemas
System.InvalidOperationException "El único IsolationLevel admitido es 'IsolationLevel.Serializable'."
Este error puede producirse si el nivel de transacción de una operación está establecido en algo distinto de Serializable
. Compruebe que no se realice ninguna operación con otros niveles de transacción.