Escalabilidad horizontal de SignalR con Redis (SignalR 1.x)

por Patrick Fletcher

Advertencia

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

En este tutorial, usará Redis para distribuir mensajes a través de una aplicación de SignalR que está implementada en dos instancias de IIS separadas.

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 illustrates the relationship between Redis Server, which subscribes to V Ms, computers, which then publish V Ms onto Redis Servers.

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 Global.asax para configurar el backplane:

    protected void Application_Start()
    {
        GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
    
        RouteTable.Routes.MapHubs();
        // ...
    }
    

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 of the New Virtual Machine Wizard showing the Connect Virtual Hard Disk pane and Name field being highlighted.

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 of the New Virtual Machine Wizard with the Installation Options pane and the Image File option being highlighted.

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 of Azure User Redis server window, showing server information including when the server was started and the memory status.

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 SignalR.Redis a su proyecto. En Visual Studio, en el menú Herramientas, seleccione Administrador de paquetes NuGet, después seleccione Consola del administrador de paquetes. En la ventana Consola del Administrador de paquetas , escriba el siguiente comando:

Install-Package Microsoft.AspNet.SignalR.Redis

A continuación, abra el archivo Global.asax. Agregue el siguiente código al método Application_Start:

protected void Application_Start()
{
    GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");

    RouteTable.Routes.MapHubs();
}
  • "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.UseRedis("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 of the Add Roles and Features Wizard with the Server Roles and Web Socket Protocol options being highlighted.

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

Screenshot of the Add Roles and Features Wizard with the Server Roles and I I S Management Scripts and Tools options being highlighted.

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 of the Web Platform Installer 4 point 5 search results screen with the Web Deploy 3 point 0 option being highlighted.

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 Cómo configurar puntos de conexión a 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 separada 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 the Signal R messages being displayed in an Internet Explorer web browser, displaying the Index screen.

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 of the Azure User output screen, which displays the information for all sent messages and accompanied code.