Compartir a través de


Configuración de un backplane de Redis para la escalabilidad horizontal de ASP.NET Core SignalR

Por Andrew Stanton-Nurse, Brady Gaster y Tom Dykstra.

En este artículo se explican SignalRaspectos específicos de la configuración de un servidor de Redis que se usará para escalar horizontalmente una aplicación de ASP.NET Core SignalR.

Advertencia

En este artículo se muestra el uso de cadena de conexión. Con una base de datos local, el usuario no tiene que autenticarse, pero en producción, cadena de conexión a veces incluye una contraseña para autenticarse. Una credencial de contraseña de propietario de recursos (ROPC) es un riesgo de seguridad que se debe evitar en las bases de datos de producción. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación de aplicaciones implementadas para probar o entornos de producción, consulte Flujos de autenticación seguros.

Configuración de un backplane de Redis

  • Implemente un servidor de Redis.

    Importante

    Para su uso en producción, solo se recomienda un backplane de Redis cuando se ejecuta en el mismo centro de datos que la aplicación de SignalR. De lo contrario, la latencia de red degrada el rendimiento. Si la aplicación de SignalR se ejecuta en la nube de Azure, se recomienda el servicio de Azure SignalR en lugar de un backplane de Redis.

    Para obtener más información, vea los siguientes recursos:

  • En la aplicación de SignalR, instale el siguiente paquete NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Llame a AddStackExchangeRedis agregando la línea siguiente antes de la línea que llama a builder.Build()) en el archivo Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure las opciones según sea necesario:

    La mayoría de las opciones se pueden establecer en la cadena de conexión o en el objeto ConfigurationOptions. Las opciones especificadas en ConfigurationOptions invalidan las establecidas en la cadena de conexión.

    El siguiente ejemplo muestra cómo establecer opciones en el objeto ConfigurationOptions. En este ejemplo se agrega un prefijo de canal para que varias aplicaciones puedan compartir la misma instancia de Redis, como se explica en el paso siguiente.

    builder.Services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp");
      });
    

    En el código anterior, options.Configuration se inicializa con lo que se especificó en la cadena de conexión.

    Para obtener información sobre las opciones de Redis, consulte la documentación de StackExchange Redis.

  • Si usa un servidor de Redis para varias aplicaciones de SignalR, use un prefijo de canal diferente para cada aplicación de SignalR.

    Establecer un prefijo de canal aísla una aplicación de SignalR de otras que usan prefijos de canal diferentes. Si no asigna prefijos diferentes, un mensaje enviado desde una aplicación a todos sus propios clientes irá a todos los clientes de todas las aplicaciones que usan el servidor de Redis como backplane.

  • Configure el software de equilibrio de carga de la granja de servidores para sesiones permanentes. Aquí tiene algunos ejemplos de documentación sobre cómo hacerlo:

Errores del servidor de Redis

Cuando un servidor de Redis deja de funcionar, SignalR produce excepciones que indican que los mensajes no se entregarán. Algunos mensajes de excepción típicos:

  • Error al escribir el mensaje
  • No se pudo invocar el método del centro 'MethodName'
  • Error de conexión a Redis

SignalR no almacena en búfer los mensajes para enviarlos cuando se vuelve a realizar la copia de seguridad del servidor. Los mensajes enviados mientras el servidor de Redis está inactivo se pierden.

SignalR vuelve a conectarse automáticamente cuando el servidor de Redis está disponible de nuevo.

Comportamiento personalizado para errores de conexión

Este es un ejemplo que muestra cómo controlar los eventos de error de conexión de Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Clúster de Redis

El clúster de Redis utiliza varios servidores de Redis activos simultáneamente para lograr una alta disponibilidad. Cuando el clúster de Redis se usa como backplane para SignalR, los mensajes se entregan a todos los nodos del clúster sin modificaciones de código en la aplicación.

Hay un equilibrio entre el número de nodos del clúster y el rendimiento del backplane. Aumentar el número de nodos aumenta la disponibilidad del clúster, pero disminuye el rendimiento porque los mensajes se deben transmitir a todos los nodos del clúster.

En la aplicación SignalR, incluya todos los posibles nodos de Redis mediante cualquiera de los enfoques siguientes:

  • Enumere los nodos en la cadena de conexión delimitada con comas.
  • Si usa un comportamiento personalizado para errores de conexión, agregue los nodos a ConfigurationOptions.Endpoints.

Pasos siguientes

Para obtener más información, vea los siguientes recursos:

En este artículo se explican SignalRaspectos específicos de la configuración de un servidor de Redis que se usará para escalar horizontalmente una aplicación de ASP.NET Core SignalR.

Advertencia

En este artículo se muestra el uso de cadena de conexión. Con una base de datos local, el usuario no tiene que autenticarse, pero en producción, cadena de conexión a veces incluye una contraseña para autenticarse. Una credencial de contraseña de propietario de recursos (ROPC) es un riesgo de seguridad que se debe evitar en las bases de datos de producción. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación de aplicaciones implementadas para probar o entornos de producción, consulte Flujos de autenticación seguros.

Configuración de un backplane de Redis

  • Implemente un servidor de Redis.

    Importante

    Para su uso en producción, solo se recomienda un backplane de Redis cuando se ejecuta en el mismo centro de datos que la aplicación de SignalR. De lo contrario, la latencia de red degrada el rendimiento. Si la aplicación de SignalR se ejecuta en la nube de Azure, se recomienda el servicio de Azure SignalR en lugar de un backplane de Redis.

    Para obtener más información, vea los siguientes recursos:

  • En la aplicación de SignalR, instale el siguiente paquete NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Llame a AddStackExchangeRedis agregando la línea siguiente antes de la línea que llama a builder.Build()) en el archivo Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure las opciones según sea necesario:

    La mayoría de las opciones se pueden establecer en la cadena de conexión o en el objeto ConfigurationOptions. Las opciones especificadas en ConfigurationOptions invalidan las establecidas en la cadena de conexión.

    El siguiente ejemplo muestra cómo establecer opciones en el objeto ConfigurationOptions. En este ejemplo se agrega un prefijo de canal para que varias aplicaciones puedan compartir la misma instancia de Redis, como se explica en el paso siguiente.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    En el código anterior, options.Configuration se inicializa con lo que se especificó en la cadena de conexión.

    Para obtener información sobre las opciones de Redis, consulte la documentación de StackExchange Redis.

  • Si usa un servidor de Redis para varias aplicaciones de SignalR, use un prefijo de canal diferente para cada aplicación de SignalR.

    Establecer un prefijo de canal aísla una aplicación de SignalR de otras que usan prefijos de canal diferentes. Si no asigna prefijos diferentes, un mensaje enviado desde una aplicación a todos sus propios clientes irá a todos los clientes de todas las aplicaciones que usan el servidor de Redis como backplane.

  • Configure el software de equilibrio de carga de la granja de servidores para sesiones permanentes. Aquí tiene algunos ejemplos de documentación sobre cómo hacerlo:

Errores del servidor de Redis

Cuando un servidor de Redis deja de funcionar, SignalR produce excepciones que indican que los mensajes no se entregarán. Algunos mensajes de excepción típicos:

  • Error al escribir el mensaje
  • No se pudo invocar el método del centro 'MethodName'
  • Error de conexión a Redis

SignalR no almacena en búfer los mensajes para enviarlos cuando se vuelve a realizar la copia de seguridad del servidor. Los mensajes enviados mientras el servidor de Redis está inactivo se pierden.

SignalR vuelve a conectarse automáticamente cuando el servidor de Redis está disponible de nuevo.

Comportamiento personalizado para errores de conexión

Este es un ejemplo que muestra cómo controlar los eventos de error de conexión de Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Clúster de Redis

El clúster de Redis utiliza varios servidores de Redis activos simultáneamente para lograr una alta disponibilidad. Cuando el clúster de Redis se usa como backplane para SignalR, los mensajes se entregan a todos los nodos del clúster sin modificaciones de código en la aplicación.

Hay un equilibrio entre el número de nodos del clúster y el rendimiento del backplane. Aumentar el número de nodos aumenta la disponibilidad del clúster, pero disminuye el rendimiento porque los mensajes se deben transmitir a todos los nodos del clúster.

En la aplicación SignalR, incluya todos los posibles nodos de Redis mediante cualquiera de los enfoques siguientes:

  • Enumere los nodos en la cadena de conexión delimitada con comas.
  • Si usa un comportamiento personalizado para errores de conexión, agregue los nodos a ConfigurationOptions.Endpoints.

Pasos siguientes

Para obtener más información, vea los siguientes recursos:

En este artículo se explican SignalRaspectos específicos de la configuración de un servidor de Redis que se usará para escalar horizontalmente una aplicación de ASP.NET Core SignalR.

Advertencia

En este artículo se muestra el uso de cadena de conexión. Con una base de datos local, el usuario no tiene que autenticarse, pero en producción, cadena de conexión a veces incluye una contraseña para autenticarse. Una credencial de contraseña de propietario de recursos (ROPC) es un riesgo de seguridad que se debe evitar en las bases de datos de producción. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación de aplicaciones implementadas para probar o entornos de producción, consulte Flujos de autenticación seguros.

Configuración de un backplane de Redis

  • Implemente un servidor de Redis.

    Importante

    Para su uso en producción, solo se recomienda un backplane de Redis cuando se ejecuta en el mismo centro de datos que la aplicación de SignalR. De lo contrario, la latencia de red degrada el rendimiento. Si la aplicación de SignalR se ejecuta en la nube de Azure, se recomienda el servicio de Azure SignalR en lugar de un backplane de Redis.

    Para obtener más información, vea los siguientes recursos:

  • En la aplicación de SignalR, instale el siguiente paquete NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Llame a AddStackExchangeRedis agregando la línea siguiente antes de la línea que llama a builder.Build()) en el archivo Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure las opciones según sea necesario:

    La mayoría de las opciones se pueden establecer en la cadena de conexión o en el objeto ConfigurationOptions. Las opciones especificadas en ConfigurationOptions invalidan las establecidas en la cadena de conexión.

    El siguiente ejemplo muestra cómo establecer opciones en el objeto ConfigurationOptions. En este ejemplo se agrega un prefijo de canal para que varias aplicaciones puedan compartir la misma instancia de Redis, como se explica en el paso siguiente.

    builder.Services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp");
      });
    

    En el código anterior, options.Configuration se inicializa con lo que se especificó en la cadena de conexión.

    Para obtener información sobre las opciones de Redis, consulte la documentación de StackExchange Redis.

  • Si usa un servidor de Redis para varias aplicaciones de SignalR, use un prefijo de canal diferente para cada aplicación de SignalR.

    Establecer un prefijo de canal aísla una aplicación de SignalR de otras que usan prefijos de canal diferentes. Si no asigna prefijos diferentes, un mensaje enviado desde una aplicación a todos sus propios clientes irá a todos los clientes de todas las aplicaciones que usan el servidor de Redis como backplane.

  • Configure el software de equilibrio de carga de la granja de servidores para sesiones permanentes. Aquí tiene algunos ejemplos de documentación sobre cómo hacerlo:

Errores del servidor de Redis

Cuando un servidor de Redis deja de funcionar, SignalR produce excepciones que indican que los mensajes no se entregarán. Algunos mensajes de excepción típicos:

  • Error al escribir el mensaje
  • No se pudo invocar el método del centro 'MethodName'
  • Error de conexión a Redis

SignalR no almacena en búfer los mensajes para enviarlos cuando se vuelve a realizar la copia de seguridad del servidor. Los mensajes enviados mientras el servidor de Redis está inactivo se pierden.

SignalR vuelve a conectarse automáticamente cuando el servidor de Redis está disponible de nuevo.

Comportamiento personalizado para errores de conexión

Este es un ejemplo que muestra cómo controlar los eventos de error de conexión de Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Clúster de Redis

El clúster de Redis utiliza varios servidores de Redis activos simultáneamente para lograr una alta disponibilidad. Cuando el clúster de Redis se usa como backplane para SignalR, los mensajes se entregan a todos los nodos del clúster sin modificaciones de código en la aplicación.

Hay un equilibrio entre el número de nodos del clúster y el rendimiento del backplane. Aumentar el número de nodos aumenta la disponibilidad del clúster, pero disminuye el rendimiento porque los mensajes se deben transmitir a todos los nodos del clúster.

En la aplicación SignalR, incluya todos los posibles nodos de Redis mediante cualquiera de los enfoques siguientes:

  • Enumere los nodos en la cadena de conexión delimitada con comas.
  • Si usa un comportamiento personalizado para errores de conexión, agregue los nodos a ConfigurationOptions.Endpoints.

Pasos siguientes

Para obtener más información, vea los siguientes recursos:

En este artículo se explican SignalRaspectos específicos de la configuración de un servidor de Redis que se usará para escalar horizontalmente una aplicación de ASP.NET Core SignalR.

Advertencia

En este artículo se muestra el uso de cadena de conexión. Con una base de datos local, el usuario no tiene que autenticarse, pero en producción, cadena de conexión a veces incluye una contraseña para autenticarse. Una credencial de contraseña de propietario de recursos (ROPC) es un riesgo de seguridad que se debe evitar en las bases de datos de producción. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación de aplicaciones implementadas para probar o entornos de producción, consulte Flujos de autenticación seguros.

Configuración de un backplane de Redis

  • Implemente un servidor de Redis.

    Importante

    Para su uso en producción, solo se recomienda un backplane de Redis cuando se ejecuta en el mismo centro de datos que la aplicación de SignalR. De lo contrario, la latencia de red degrada el rendimiento. Si la aplicación de SignalR se ejecuta en la nube de Azure, se recomienda el servicio de Azure SignalR en lugar de un backplane de Redis.

    Para obtener más información, vea los siguientes recursos:

  • En la aplicación de SignalR, instale el siguiente paquete NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • En el método Startup.ConfigureServices, llame a AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure las opciones según sea necesario:

    La mayoría de las opciones se pueden establecer en la cadena de conexión o en el objeto ConfigurationOptions. Las opciones especificadas en ConfigurationOptions invalidan las establecidas en la cadena de conexión.

    El siguiente ejemplo muestra cómo establecer opciones en el objeto ConfigurationOptions. En este ejemplo se agrega un prefijo de canal para que varias aplicaciones puedan compartir la misma instancia de Redis, como se explica en el paso siguiente.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    En el código anterior, options.Configuration se inicializa con lo que se especificó en la cadena de conexión.

    Para obtener información sobre las opciones de Redis, consulte la documentación de StackExchange Redis.

  • Si usa un servidor de Redis para varias aplicaciones de SignalR, use un prefijo de canal diferente para cada aplicación de SignalR.

    Establecer un prefijo de canal aísla una aplicación de SignalR de otras que usan prefijos de canal diferentes. Si no asigna prefijos diferentes, un mensaje enviado desde una aplicación a todos sus propios clientes irá a todos los clientes de todas las aplicaciones que usan el servidor de Redis como backplane.

  • Configure el software de equilibrio de carga de la granja de servidores para sesiones permanentes. Aquí tiene algunos ejemplos de documentación sobre cómo hacerlo:

Errores del servidor de Redis

Cuando un servidor de Redis deja de funcionar, SignalR produce excepciones que indican que los mensajes no se entregarán. Algunos mensajes de excepción típicos:

  • Error al escribir el mensaje
  • No se pudo invocar el método del centro 'MethodName'
  • Error de conexión a Redis

SignalR no almacena en búfer los mensajes para enviarlos cuando se vuelve a realizar la copia de seguridad del servidor. Los mensajes enviados mientras el servidor de Redis está inactivo se pierden.

SignalR vuelve a conectarse automáticamente cuando el servidor de Redis está disponible de nuevo.

Comportamiento personalizado para errores de conexión

Este es un ejemplo que muestra cómo controlar los eventos de error de conexión de Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Clúster de Redis

El clúster de Redis utiliza varios servidores de Redis activos simultáneamente para lograr una alta disponibilidad. Cuando el clúster de Redis se usa como backplane para SignalR, los mensajes se entregan a todos los nodos del clúster sin modificaciones de código en la aplicación.

Hay un equilibrio entre el número de nodos del clúster y el rendimiento del backplane. Aumentar el número de nodos aumenta la disponibilidad del clúster, pero disminuye el rendimiento porque los mensajes se deben transmitir a todos los nodos del clúster.

En la aplicación SignalR, incluya todos los posibles nodos de Redis mediante cualquiera de los enfoques siguientes:

  • Enumere los nodos en la cadena de conexión delimitada con comas.
  • Si usa un comportamiento personalizado para errores de conexión, agregue los nodos a ConfigurationOptions.Endpoints.

Pasos siguientes

Para obtener más información, vea los siguientes recursos:

En este artículo se explican SignalRaspectos específicos de la configuración de un servidor de Redis que se usará para escalar horizontalmente una aplicación de ASP.NET Core SignalR.

Advertencia

En este artículo se muestra el uso de cadena de conexión. Con una base de datos local, el usuario no tiene que autenticarse, pero en producción, cadena de conexión a veces incluye una contraseña para autenticarse. Una credencial de contraseña de propietario de recursos (ROPC) es un riesgo de seguridad que se debe evitar en las bases de datos de producción. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación de aplicaciones implementadas para probar o entornos de producción, consulte Flujos de autenticación seguros.

Configuración de un backplane de Redis

  • Implemente un servidor de Redis.

    Importante

    Para su uso en producción, solo se recomienda un backplane de Redis cuando se ejecuta en el mismo centro de datos que la aplicación de SignalR. De lo contrario, la latencia de red degrada el rendimiento. Si la aplicación de SignalR se ejecuta en la nube de Azure, se recomienda el servicio de Azure SignalR en lugar de un backplane de Redis.

    Para obtener más información, vea los siguientes recursos:

  • En la aplicación de SignalR, instale el siguiente paquete NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • En el método Startup.ConfigureServices, llame a AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure las opciones según sea necesario:

    La mayoría de las opciones se pueden establecer en la cadena de conexión o en el objeto ConfigurationOptions. Las opciones especificadas en ConfigurationOptions invalidan las establecidas en la cadena de conexión.

    El siguiente ejemplo muestra cómo establecer opciones en el objeto ConfigurationOptions. En este ejemplo se agrega un prefijo de canal para que varias aplicaciones puedan compartir la misma instancia de Redis, como se explica en el paso siguiente.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    En el código anterior, options.Configuration se inicializa con lo que se especificó en la cadena de conexión.

    Para obtener información sobre las opciones de Redis, consulte la documentación de StackExchange Redis.

  • Si usa un servidor de Redis para varias aplicaciones de SignalR, use un prefijo de canal diferente para cada aplicación de SignalR.

    Establecer un prefijo de canal aísla una aplicación de SignalR de otras que usan prefijos de canal diferentes. Si no asigna prefijos diferentes, un mensaje enviado desde una aplicación a todos sus propios clientes irá a todos los clientes de todas las aplicaciones que usan el servidor de Redis como backplane.

  • Configure el software de equilibrio de carga de la granja de servidores para sesiones permanentes. Aquí tiene algunos ejemplos de documentación sobre cómo hacerlo:

Errores del servidor de Redis

Cuando un servidor de Redis deja de funcionar, SignalR produce excepciones que indican que los mensajes no se entregarán. Algunos mensajes de excepción típicos:

  • Error al escribir el mensaje
  • No se pudo invocar el método del centro 'MethodName'
  • Error de conexión a Redis

SignalR no almacena en búfer los mensajes para enviarlos cuando se vuelve a realizar la copia de seguridad del servidor. Los mensajes enviados mientras el servidor de Redis está inactivo se pierden.

SignalR vuelve a conectarse automáticamente cuando el servidor de Redis está disponible de nuevo.

Comportamiento personalizado para errores de conexión

Este es un ejemplo que muestra cómo controlar los eventos de error de conexión de Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Clúster de Redis

El clúster de Redis utiliza varios servidores de Redis activos simultáneamente para lograr una alta disponibilidad. Cuando el clúster de Redis se usa como backplane para SignalR, los mensajes se entregan a todos los nodos del clúster sin modificaciones de código en la aplicación.

Hay un equilibrio entre el número de nodos del clúster y el rendimiento del backplane. Aumentar el número de nodos aumenta la disponibilidad del clúster, pero disminuye el rendimiento porque los mensajes se deben transmitir a todos los nodos del clúster.

En la aplicación SignalR, incluya todos los posibles nodos de Redis mediante cualquiera de los enfoques siguientes:

  • Enumere los nodos en la cadena de conexión delimitada con comas.
  • Si usa un comportamiento personalizado para errores de conexión, agregue los nodos a ConfigurationOptions.Endpoints.

Pasos siguientes

Para obtener más información, vea los siguientes recursos:

En este artículo se explican SignalRaspectos específicos de la configuración de un servidor de Redis que se usará para escalar horizontalmente una aplicación de ASP.NET Core SignalR.

Advertencia

En este artículo se muestra el uso de cadena de conexión. Con una base de datos local, el usuario no tiene que autenticarse, pero en producción, cadena de conexión a veces incluye una contraseña para autenticarse. Una credencial de contraseña de propietario de recursos (ROPC) es un riesgo de seguridad que se debe evitar en las bases de datos de producción. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación de aplicaciones implementadas para probar o entornos de producción, consulte Flujos de autenticación seguros.

Configuración de un backplane de Redis

  • Implemente un servidor de Redis.

    Importante

    Para su uso en producción, solo se recomienda un backplane de Redis cuando se ejecuta en el mismo centro de datos que la aplicación de SignalR. De lo contrario, la latencia de red degrada el rendimiento. Si la aplicación de SignalR se ejecuta en la nube de Azure, se recomienda el servicio de Azure SignalR en lugar de un backplane de Redis.

    Para obtener más información, vea los siguientes recursos:

  • En la aplicación de SignalR, instale uno de los siguientes paquetes NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis: depende de StackExchange.Redis 2.X.X. Este es el paquete recomendado para ASP.NET Core 2.2 y versiones posteriores.
    • Microsoft.AspNetCore.SignalR.Redis: depende de StackExchange.Redis 1.X.X. Este paquete no está incluido en ASP.NET Core 3.0 y posteriores.
  • En el método Startup.ConfigureServices, llame a AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    

Al usar Microsoft.AspNetCore.SignalR.Redis, llame a AddRedis.

  • Configure las opciones según sea necesario:

    La mayoría de las opciones pueden establecerse en la cadena de conexión o en el objeto ConfigurationOptions. Las opciones especificadas en ConfigurationOptions invalidan las establecidas en la cadena de conexión.

    El siguiente ejemplo muestra cómo establecer opciones en el objeto ConfigurationOptions. En este ejemplo se agrega un prefijo de canal para que varias aplicaciones puedan compartir la misma instancia de Redis, como se explica en el paso siguiente.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

Al usar Microsoft.AspNetCore.SignalR.Redis, llame a AddRedis.

En el código anterior, options.Configuration se inicializa con lo que se especificó en la cadena de conexión.

Para obtener información sobre las opciones de Redis, consulte la documentación de StackExchange Redis.

  • Si usa un servidor de Redis para varias aplicaciones de SignalR, use un prefijo de canal diferente para cada aplicación de SignalR.

    Establecer un prefijo de canal aísla una aplicación de SignalR de otras que usan prefijos de canal diferentes. Si no asigna prefijos diferentes, un mensaje enviado desde una aplicación a todos sus propios clientes irá a todos los clientes de todas las aplicaciones que usan el servidor de Redis como backplane.

  • Configure el software de equilibrio de carga de la granja de servidores para sesiones permanentes. Aquí tiene algunos ejemplos de documentación sobre cómo hacerlo:

Errores del servidor de Redis

Cuando un servidor de Redis deja de funcionar, SignalR produce excepciones que indican que los mensajes no se entregarán. Algunos mensajes de excepción típicos:

  • Error al escribir el mensaje
  • No se pudo invocar el método del centro 'MethodName'
  • Error de conexión a Redis

SignalR no almacena en búfer los mensajes para enviarlos cuando se vuelve a realizar la copia de seguridad del servidor. Los mensajes enviados mientras el servidor de Redis está inactivo se pierden.

SignalR vuelve a conectarse automáticamente cuando el servidor de Redis está disponible de nuevo.

Comportamiento personalizado para errores de conexión

Este es un ejemplo que muestra cómo controlar los eventos de error de conexión de Redis.

services.AddSignalR()
        .AddMessagePackProtocol()
        .AddStackExchangeRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Clúster de Redis

El clúster de Redis utiliza varios servidores de Redis activos simultáneamente para lograr una alta disponibilidad. Cuando el clúster de Redis se usa como backplane para SignalR, los mensajes se entregan a todos los nodos del clúster sin modificaciones de código en la aplicación.

Hay un equilibrio entre el número de nodos del clúster y el rendimiento del backplane. Aumentar el número de nodos aumenta la disponibilidad del clúster, pero disminuye el rendimiento porque los mensajes se deben transmitir a todos los nodos del clúster.

En la aplicación SignalR, incluya todos los posibles nodos de Redis mediante cualquiera de los enfoques siguientes:

  • Enumere los nodos en la cadena de conexión delimitada con comas.
  • Si usa un comportamiento personalizado para errores de conexión, agregue los nodos a ConfigurationOptions.Endpoints.

Pasos siguientes

Para obtener más información, vea los siguientes recursos:

En este artículo se explican SignalRaspectos específicos de la configuración de un servidor de Redis que se usará para escalar horizontalmente una aplicación de ASP.NET Core SignalR.

Advertencia

En este artículo se muestra el uso de cadena de conexión. Con una base de datos local, el usuario no tiene que autenticarse, pero en producción, cadena de conexión a veces incluye una contraseña para autenticarse. Una credencial de contraseña de propietario de recursos (ROPC) es un riesgo de seguridad que se debe evitar en las bases de datos de producción. Las aplicaciones de producción deben usar el flujo de autenticación más seguro disponible. Para obtener más información sobre la autenticación de aplicaciones implementadas para probar o entornos de producción, consulte Flujos de autenticación seguros.

Configuración de un backplane de Redis

  • Implemente un servidor de Redis.

    Importante

    Para su uso en producción, solo se recomienda un backplane de Redis cuando se ejecuta en el mismo centro de datos que la aplicación de SignalR. De lo contrario, la latencia de red degrada el rendimiento. Si la aplicación de SignalR se ejecuta en la nube de Azure, se recomienda el servicio de Azure SignalR en lugar de un backplane de Redis.

    Para obtener más información, vea los siguientes recursos:

  • En la aplicación de SignalR, instale el paquete de NuGet Microsoft.AspNetCore.SignalR.Redis.

  • En el método Startup.ConfigureServices, llame a AddRedis después de AddSignalR:

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • Configure las opciones según sea necesario:

    La mayoría de las opciones pueden establecerse en la cadena de conexión o en el objeto ConfigurationOptions. Las opciones especificadas en ConfigurationOptions invalidan las establecidas en la cadena de conexión.

    El siguiente ejemplo muestra cómo establecer opciones en el objeto ConfigurationOptions. En este ejemplo se agrega un prefijo de canal para que varias aplicaciones puedan compartir la misma instancia de Redis, como se explica en el paso siguiente.

    services.AddSignalR()
      .AddRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    En el código anterior, options.Configuration se inicializa con lo que se especificó en la cadena de conexión.

  • Si usa un servidor de Redis para varias aplicaciones de SignalR, use un prefijo de canal diferente para cada aplicación de SignalR.

    Establecer un prefijo de canal aísla una aplicación de SignalR de otras que usan prefijos de canal diferentes. Si no asigna prefijos diferentes, un mensaje enviado desde una aplicación a todos sus propios clientes irá a todos los clientes de todas las aplicaciones que usan el servidor de Redis como backplane.

  • Configure el software de equilibrio de carga de la granja de servidores para sesiones permanentes. Aquí tiene algunos ejemplos de documentación sobre cómo hacerlo:

Errores del servidor de Redis

Cuando un servidor de Redis deja de funcionar, SignalR produce excepciones que indican que los mensajes no se entregarán. Algunos mensajes de excepción típicos:

  • Error al escribir el mensaje
  • No se pudo invocar el método del centro 'MethodName'
  • Error de conexión a Redis

SignalR no almacena en búfer los mensajes para enviarlos cuando se vuelve a realizar la copia de seguridad del servidor. Los mensajes enviados mientras el servidor de Redis está inactivo se pierden.

SignalR vuelve a conectarse automáticamente cuando el servidor de Redis está disponible de nuevo.

Comportamiento personalizado para errores de conexión

Este es un ejemplo que muestra cómo controlar los eventos de error de conexión de Redis.

services.AddSignalR()
        .AddRedis(o =>
        {
            o.ConnectionFactory = async writer =>
            {
                var config = new ConfigurationOptions
                {
                    AbortOnConnectFail = false
                };
                config.EndPoints.Add(IPAddress.Loopback, 0);
                config.SetDefaultPorts();
                var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
                connection.ConnectionFailed += (_, e) =>
                {
                    Console.WriteLine("Connection to Redis failed.");
                };

                if (!connection.IsConnected)
                {
                    Console.WriteLine("Did not connect to Redis.");
                }

                return connection;
            };
        });

Clúster de Redis

El clúster de Redis utiliza varios servidores de Redis activos simultáneamente para lograr una alta disponibilidad. Cuando el clúster de Redis se usa como backplane para SignalR, los mensajes se entregan a todos los nodos del clúster sin modificaciones de código en la aplicación.

Hay un equilibrio entre el número de nodos del clúster y el rendimiento del backplane. Aumentar el número de nodos aumenta la disponibilidad del clúster, pero disminuye el rendimiento porque los mensajes se deben transmitir a todos los nodos del clúster.

En la aplicación SignalR, incluya todos los posibles nodos de Redis mediante cualquiera de los enfoques siguientes:

  • Enumere los nodos en la cadena de conexión delimitada con comas.
  • Si usa un comportamiento personalizado para errores de conexión, agregue los nodos a ConfigurationOptions.Endpoints.

Pasos siguientes

Para obtener más información, vea los siguientes recursos: