Escalabilidad horizontal de SignalR con RedisSignalR Scaleout with Redis

por Mike Wassonby Mike Wasson

Warning

Esta documentación no es la versión más reciente de SignalR.This documentation isn't for the latest version of SignalR. Eche un vistazo a ASP.NET Core SignalR.Take a look at ASP.NET Core SignalR.

Versiones de software que se usa en este temaSoftware versions used in this topic

Versiones anteriores de este tema.Previous versions of this topic

Para obtener información acerca de las versiones anteriores de SignalR, consulte versiones anteriores de SignalR.For information about earlier versions of SignalR, see SignalR Older Versions.

Preguntas y comentariosQuestions and comments

Deje comentarios sobre cómo le gustó de este tutorial y que podíamos mejorar en los comentarios en la parte inferior de la página.Please leave feedback on how you liked this tutorial and what we could improve in the comments at the bottom of the page. Si tiene preguntas que no están directamente relacionados con el tutorial, puede publicarlos en el foro de ASP.NET SignalR o StackOverflow.com.If you have questions that are not directly related to the tutorial, you can post them to the ASP.NET SignalR forum or StackOverflow.com.

En este tutorial, usará Redis para distribuir los mensajes a través de una aplicación de SignalR que se implementa en dos instancias independientes de IIS.In this tutorial, you will use Redis to distribute messages across a SignalR application that is deployed on two separate IIS instances.

Redis es un almacén de pares clave-valor en memoria.Redis is an in-memory key-value store. También admite un sistema de mensajería con un modelo de publicación/suscripción.It also supports a messaging system with a publish/subscribe model. El backplane SignalR Redis usa la característica de pub/sub para reenviar los mensajes a otros servidores.The SignalR Redis backplane uses the pub/sub feature to forward messages to other servers.

Para este tutorial, usará los tres servidores:For this tutorial, you will use three servers:

  • Dos servidores que ejecuten Windows, que usará para implementar una aplicación de SignalR.Two servers running Windows, which you will use to deploy a SignalR application.
  • Un servidor que ejecuta Linux, que usará para ejecutar Redis.One server running Linux, which you will use to run Redis. Para las capturas de pantalla en este tutorial, usé Ubuntu 12.04 TLS.For the screenshots in this tutorial, I used Ubuntu 12.04 TLS.

Si no tiene tres servidores físicos a usar, puede crear máquinas virtuales en Hyper-V.If you don't have three physical servers to use, you can create VMs on Hyper-V. Otra opción es crear máquinas virtuales en Azure.Another option is to create VMs on Azure.

Aunque este tutorial usa la implementación de Redis oficial, hay también un Windows puerto de Redis desde MSOpenTech.Although this tutorial uses the official Redis implementation, there is also a Windows port of Redis from MSOpenTech. Instalación y configuración son diferentes, pero en caso contrario, los pasos son los mismos.Setup and configuration are different, but otherwise the steps are the same.

Note

Escalabilidad horizontal de SignalR con Redis no admite clústeres de Redis.SignalR scaleout with Redis does not support Redis clusters.

Información generalOverview

Antes de entrar en el tutorial detallado, le presentamos una introducción rápida de lo que hará.Before we get to the detailed tutorial, here is a quick overview of what you will do.

  1. Para instalar Redis e inicie el servidor de Redis.Install Redis and start the Redis server.

  2. Agregue estos paquetes de NuGet para la aplicación:Add these NuGet packages to your application:

  3. Cree una aplicación de SignalR.Create a SignalR application.

  4. Agregue el siguiente código en Startup.cs, para configurar la placa posterior:Add the following code to Startup.cs to configure the 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-VUbuntu on Hyper-V

Con Windows Hyper-V, puede crear fácilmente una VM de Ubuntu en Windows Server.Using Windows Hyper-V, you can easily create an Ubuntu VM on Windows Server.

Descargue el archivo ISO de Ubuntu de http://www.ubuntu.com .Download the Ubuntu ISO from http://www.ubuntu.com.

En Hyper-V, agregue una nueva máquina virtual.In Hyper-V, add a new VM. En el conectar disco duro Virtual paso, seleccione crear un disco duro virtual.In the Connect Virtual Hard Disk step, select Create a virtual hard disk.

En el opciones de instalación paso, seleccione archivo de imagen (.iso), haga clic en examinary vaya a la imagen ISO de instalación de Ubuntu.In the Installation Options step, select Image file (.iso), click Browse, and browse to the Ubuntu installation ISO.

Para instalar RedisInstall Redis

Siga los pasos de http://redis.io/download descarguen y compilen Redis.Follow the steps at http://redis.io/download to download and build 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 genera los archivos binarios de Redis el src directory.This builds the Redis binaries in the src directory.

De forma predeterminada, Redis no requiere una contraseña.By default, Redis does not require a password. Para establecer una contraseña, edite el redis.conf archivo, que se encuentra en el directorio raíz del código fuente.To set a password, edit the redis.conf file, which is located in the root directory of the source code. (Realizar una copia de seguridad del archivo antes de modificarlo!) Agregue la siguiente directiva a redis.conf:(Make a backup copy of the file before you edit it!) Add the following directive to redis.conf:

requirepass YourStrongPassword1234

Ahora, inicie el servidor de Redis:Now start the Redis server:

src/redis-server redis.conf

Abrir el puerto 6379, que es el puerto predeterminado que Redis escucha en.Open port 6379, which is the default port that Redis listens on. (Puede cambiar el número de puerto en el archivo de configuración).(You can change the port number in the configuration file.)

Crear la aplicación de SignalRCreate the SignalR Application

Cree una aplicación de SignalR con cualquiera de estos tutoriales:Create a SignalR application by following either of these tutorials:

A continuación, modificaremos la aplicación de chat para admitir la escalabilidad horizontal con Redis.Next, we'll modify the chat application to support scaleout with Redis. En primer lugar, agregue el Microsoft.AspNet.SignalR.StackExchangeRedis paquete NuGet al proyecto.First, add the Microsoft.AspNet.SignalR.StackExchangeRedis NuGet package to your project. En Visual Studio, desde el herramientas menú, seleccione Administrador de paquetes de NuGet, a continuación, seleccione Package Manager Console.In Visual Studio, from the Tools menu, select NuGet Package Manager, then select Package Manager Console. En la ventana de consola de administrador de paquetes, escriba el siguiente comando:In the Package Manager Console window, enter the following command:

Install-Package Microsoft.AspNet.SignalR.StackExchangeRedis

A continuación, abra el archivo Startup.cs.Next, open the Startup.cs file. Agregue el código siguiente a la configuración método:Add the following code to the Configuration method:

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 se está ejecutando Redis."server" is the name of the server that is running Redis.
  • puerto es el número de puertoport is the port number
  • "password" es la contraseña que ha definido en el archivo redis.conf."password" is the password that you defined in the redis.conf file.
  • "AppName" es cualquier cadena."AppName" is any string. SignalR crea un canal de pub/sub de Redis con este nombre.SignalR creates a Redis pub/sub channel with this name.

Por ejemplo:For example:

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

Implemente y ejecute la aplicaciónDeploy and Run the Application

Preparar las instancias de Windows Server para implementar la aplicación de SignalR.Prepare your Windows Server instances to deploy the SignalR application.

Agregue el rol IIS.Add the IIS role. Incluye características de "Desarrollo de aplicaciones", incluido el protocolo WebSocket.Include "Application Development" features, including the WebSocket Protocol.

También incluyen el servicio de administración (que se muestran en "Herramientas de administración").Also include the Management Service (listed under "Management Tools").

Instalar Web Deploy 3.0.Install Web Deploy 3.0. Cuando se ejecuta el Administrador de IIS, se le pedirá que instale la plataforma Web de Microsoft, o bien puede descargar el instalador.When you run IIS Manager, it will prompt you to install Microsoft Web Platform, or you can download the installer. En el instalador de plataforma, buscar Web Deploy e instalar Web Deploy 3.0In the Platform Installer, search for Web Deploy and install Web Deploy 3.0

Compruebe que se está ejecutando el servicio de administración Web.Check that the Web Management Service is running. Si no es así, inicie el servicio.If not, start the service. (Si no ve el servicio de administración en la lista de servicios de Windows, asegúrese de que instaló el servicio de administración cuando se agrega el rol de IIS.)(If you don't see Web Management Service in the list of Windows services, make sure that you installed the Management Service when you added the IIS role.)

De forma predeterminada, el servicio de administración Web escucha en el puerto TCP 8172.By default, the Web Management Service listens on TCP port 8172. En el Firewall de Windows, cree una nueva regla de entrada para permitir el tráfico TCP en el puerto 8172.In Windows Firewall, create a new inbound rule to allow TCP traffic on port 8172. Para obtener más información, consulte configurar reglas de Firewall.For more information, see Configuring Firewall Rules. (Si va a hospedar las máquinas virtuales en Azure, puede hacerlo directamente en el portal de Azure.(If you are hosting the VMs on Azure, you can do this directly in the Azure portal. Consulte cómo configurar extremos en una máquina Virtual.)See How to Set Up Endpoints to a Virtual Machine.)

Ahora está listo para implementar el proyecto de Visual Studio desde el equipo de desarrollo para el servidor.Now you are ready to deploy the Visual Studio project from your development machine to the server. En el Explorador de soluciones, haga clic en la solución y haga clic en publicar.In Solution Explorer, right-click the solution and click Publish.

Para obtener información más detallada sobre la implementación web, consulte mapa de contenido de implementación Web para Visual Studio y ASP.NET.For more detailed documentation about web deployment, see Web Deployment Content Map for Visual Studio and ASP.NET.

Si implementa la aplicación en dos servidores, puede abrir cada instancia en otra ventana del explorador y vea que reciban mensajes de SignalR desde la otra.If you deploy the application to two servers, you can open each instance in a separate browser window and see that they each receive SignalR messages from the other. (Por supuesto, en un entorno de producción, los dos servidores sentaba detrás de un equilibrador de carga.)(Of course, in a production environment, the two servers would sit behind a load balancer.)

Si siente curiosidad por ver los mensajes que se envían a Redis, puede usar el redis-cli cliente, que se instala con Redis.If you're curious to see the messages that are sent to Redis, you can use the redis-cli client, which installs with Redis.

redis-cli -a password
SUBSCRIBE ChatApp