Compartir a través de


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.)

Diagram that shows arrows from Topic to Web Roles to computers. An arrow labeled publish starts at Web Roles and goes to Topic.

Requisitos previos:

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.

  1. Use el portal de Microsoft Azure para crear un nuevo espacio de nombres de Service Bus.

  2. Agregue estos paquetes NuGet a su aplicación:

  3. Cree una aplicación de SignalR.

  4. 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.

Screenshot of the option Cloud Service circled in red.

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".

Screenshot of window titled add a new namespace with options below.

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.

Screenshot that shows the New Project dialog box. Cloud is selected in the Office Share Point folder. Chat Service is in the Name field.

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.

Screenshot that shows the New Windows Azure Cloud Service dialog box. Signal R Chat is typed above A S P dot NET Web Role.

En el cuadro de diálogo Nuevo proyecto ASP.NET, seleccione MVC y haga clic en Aceptar.

Screenshot that shows the New A S P dot NET Project dialog box. M V C is the selected template.

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.

Screenshot that shows a plus sign labeled Create, a key labeled Access Key, and a trash can labeled Delete.

Copie la cadena de conexión en el Portapapeles y péguela en la variable connectionString.

Screenshot that shows the Access Key Connect to your namespace dialog box.

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.

Screenshot that shows an open folder titled Roles. Signal R Chat is selected.

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.

Screenshot that shows Instances. The Instance count is set to 2 and the V M Size is set to Extra small.

Guarde los cambios.

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto ChatService. Seleccione Publicar.

Screenshot that shows Solution Explorer. Publish is selected in the Chat Service context menu.

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.

Screenshot that shows the Publish Windows Azure Application dialog box. Sign in to download credentials is circled in red.

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.

Screenshot that shows the Windows Azure Publish Settings page.

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".

Screenshot of navigation menu with topics selected.

La actividad del mensaje tarda unos minutos en aparecer en el panel.

Screenshot that shows a graph of subscription and message activity on a timeline.

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.