Escalabilidad horizontal de SignalR con Redis

Advertencia

Esta documentación no se aplica a la última versión de SignalR. Eche un vistazo a ASP.NET Core SignalR.

Versiones de software empleadas en este tema

Versiones anteriores de este tema

Para obtener información sobre versiones anteriores de SignalR, consulte Versiones anteriores de SignalR.

Preguntas y comentarios

Deje sus comentarios sobre este tutorial y sobre lo que podríamos mejorar en los comentarios en la parte inferior de la página. Si tiene alguna pregunta que no esté directamente relacionadas con el tutorial, puede publicarla en el foro de ASP.NET SignalR o en StackOverflow.com.

En este tutorial, usará Redis para distribuir mensajes mediante una aplicación de SignalR que está implementada en dos instancias de IIS distintas.

Redis es un almacén de clave-valor en memoria. También es compatible con un sistema de mensajería con un modelo de publicación/suscripción. El backplane de SignalR Redis usa la característica pub/sub para reenviar mensajes a otros servidores.

Diagram that shows arrows going from Redis Server to V M and then to computers. One arrow labeled Publish goes from V M to Redis Server.

Para este tutorial, usará tres servidores:

  • Dos servidores con Windows, que usará para implementar una aplicación de SignalR.
  • Un servidor con Linux, que usará para ejecutar Redis. Para las capturas de pantalla de este tutorial, he usado Ubuntu 12.04 TLS.

Si no tiene tres servidores físicos para usar, puede crear máquinas virtuales en Hyper-V. Otra opción es crear máquinas virtuales en Azure.

Aunque este tutorial usa la implementación oficial de Redis, también existe un puerto para Windows de Redis de MSOpenTech. La instalación y la configuración son diferentes, pero por lo demás los pasos son los mismos.

Nota:

El escalado de SignalR con Redis no es compatible con los clústeres de Redis.

Información general

Antes de pasar al tutorial detallado, aquí tiene una rápida introducción a lo que va a hacer.

  1. Instale Redis e inicie el servidor Redis.

  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 class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            GlobalHost.DependencyResolver.UseStackExchangeRedis("server", port, "password", "AppName");
            app.MapSignalR();
        }
    }
    

Ubuntu en Hyper-V

Usando Windows Hyper-V, puede crear fácilmente una máquina virtual de Ubuntu en Windows Server.

Descargue la ISO de Ubuntu desde http://www.ubuntu.com.

En Hyper-V, agregue una nueva máquina virtual. En el paso Conectar disco duro virtual, seleccione Crear un disco duro virtual.

Screenshot that shows the New Virtual Machine Wizard dialog box. Connect Virtual Hard Disk and Create a virtual hard disk are selected.

En el paso Opciones de instalación, seleccione Archivo de imagen (.iso), haga clic en Buscar y busque la ISO de instalación de Ubuntu.

Screenshot that shows the New Virtual Machine Wizard on the Installation Options page. Install an O S from a boot C D D V D ROM and Image file dot i s o are selected.

Instalación de Redis

Siga los pasos en http://redis.io/download para descargar y compilar Redis.

wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz
tar xzf redis-2.6.12.tar.gz
cd redis-2.6.12
make

Esto compila los binarios de Redis en el directorio src.

De manera predeterminada, Redis no requiere contraseña. Para establecer una contraseña, edite el archivo redis.conf, que se encuentra en el directorio raíz del código de origen. (Haga una copia de seguridad del archivo antes de editarlo.) Agregue la siguiente directiva a redis.conf:

requirepass YourStrongPassword1234

Ahora inicie el servidor Redis:

src/redis-server redis.conf

Screenshot that shows the main page of the Redis server.

Abra el puerto 6379, que es el puerto predeterminado en el que escucha Redis. (Puede migrar el número de puerto en el archivo de configuración.)

Creación de la aplicación de SignalR

Cree una aplicación de SignalR siguiendo cualquiera de estos tutoriales:

A continuación, modificaremos la aplicación de chat para que sea compatible con Redis. En primer lugar, agregue el paquete NuGet Microsoft.AspNet.SignalR.StackExchangeRedis al proyecto. En Visual Studio, en el menú Herramientas, seleccione Administrador de paquetes NuGet, después, Consola del administrador de paquetes. En la ventana Consola del Administrador de paquetas , escriba el siguiente comando:

Install-Package Microsoft.AspNet.SignalR.StackExchangeRedis

A continuación, abra el archivo Startup.cs. Agregue el código siguiente al método Configuration:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Any connection or hub wire up and configuration should go here
        GlobalHost.DependencyResolver.UseStackExchangeRedis("server", port, "password", "AppName");
        app.MapSignalR();
    }
}
  • "server" es el nombre del servidor que ejecuta Redis.
  • port es el número de puerto
  • "password" es la contraseña que definió en el archivo redis.conf.
  • "AppName" es cualquier cadena. SignalR crea un canal Redis pub/sub con este nombre.

Por ejemplo:

GlobalHost.DependencyResolver.UseStackExchangeRedis("redis-server.cloudapp.net", 6379,
    "MyStrongPassword1234", "ChatApp");

Implementación y ejecución de la aplicación

Prepare sus instancias de Windows Server para implementar la aplicación de SignalR.

Agregue el rol de IIS. Incluya características de "Desarrollo de aplicaciones", incluido el protocolo WebSocket.

Screenshot that shows Add Roles and Features Wizard. Server Roles and WebSocket Protocol are selected.

Incluya también el servicio de administración (listado en "Herramientas de administración").

Screenshot that shows Add Roles and Features Wizard. Management Service is selected.

Instale Web Deploy 3.0. Cuando ejecute el Administrador de IIS, le solicitará que instale la Plataforma web de Microsoft, o bien, puede descargar el instalador. En el Instalador de plataforma, busque Web Deploy e instale Web Deploy 3.0

Screenshot that shows Web Platform Installer 4 point 5 dialog box. Web Deploy 3 point 0 is selected.

Compruebe que el Servicio de administración web está en funcionamiento. Si no es así, inicie el servicio. (Si no ve el Servicio de administración web en la lista de servicios de Windows, asegúrese de haber instalado el Servicio de administración cuando agregó el rol de IIS.)

De manera predeterminada, el Servicio de administración web escucha en el puerto TCP 8172. En el firewall de Windows, cree una nueva regla de entrada para permitir el tráfico TCP en el puerto 8172. Para más información, consulte Configuración de las reglas de firewall. (Si está hospedando las máquinas virtuales en Azure, puede hacerlo directamente en Azure Portal. Consulte Configuración de puntos de conexión en una máquina virtual.)

Ahora está listo para implementar el proyecto de Visual Studio desde su máquina de desarrollo al servidor. En el Explorador de soluciones, haga clic con el botón derecho en la solución y haga clic en Publicar.

Para obtener documentación más detallada sobre la implementación web, consulte Mapa de contenidos de implementación web para Visual Studio y ASP.NET.

Si implementa la aplicación en dos servidores, puede abrir cada instancia en una ventana distinta del explorador y ver que cada una recibe mensajes de SignalR de la otra. (Por supuesto, en un entorno de producción, los dos servidores se situarían detrás de un equilibrador de carga.)

Screenshot of two browser windows open showing the application deployed to two servers.

Si tiene curiosidad por ver los mensajes que se envían a Redis, puede usar el cliente redis-cli, que se instala con Redis.

redis-cli -a password
SUBSCRIBE ChatApp

Screenshot that shows a numbered list in a Redis window.