Partilhar via


Configurar um backplane do Redis para dimensionamento SignalR do ASP.NET Core

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

Esse artigo explica aspectos específicos do SignalR da configuração de um servidor Redis a ser usado para dimensionar um aplicativo ASP.NET CoreSignalR.

Aviso

Este artigo mostra o uso de cadeias de conexão. Com um banco de dados local, o usuário não precisa ser autenticado, mas na produção, as cadeias de conexão às vezes incluem uma senha para autenticação. Uma credencial de senha do proprietário do recurso (ROPC) é um risco de segurança que deve ser evitado em bancos de dados de produção. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos implantados em ambientes de teste ou produção, consulte Fluxos de autenticação seguros.

Configurar um backplane do Redis

  • Implantar um servidor Redis.

    Importante

    Para uso em produção, um backplane do Redis é recomendado somente quando ele é executado no mesmo data center que o aplicativo SignalR. Caso contrário, a latência de rede degrada o desempenho. Se o aplicativo SignalR estiver em execução na nuvem do Azure, recomendamos o Serviço SignalR do Azure em vez de um backplane do Redis.

    Para saber mais, consulte os recursos a seguir:

  • No aplicativo SignalR, instale um dos seguintes pacotes NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Chame AddStackExchangeRedis adicionando a seguinte linha antes da linha que chama builder.Build()) no arquivo Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure as opções conforme necessário:

    A maioria das opções pode ser definida na cadeia de conexão ou no objeto ConfigurationOptions. As opções especificadas em ConfigurationOptions substituem as definidas na cadeia de conexão.

    O exemplo a seguir mostra como definir opções no objeto ConfigurationOptions. Esse exemplo adiciona um prefixo de canal para que vários aplicativos possam compartilhar a mesma instância do Redis, conforme explicado na etapa a seguir.

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

    No código anterior, options.Configuration é inicializado com o que foi especificado na cadeia de conexão.

    Para obter informações sobre as opções do Redis, consulte a documentação do StackExchange Redis.

  • Se você estiver usando um servidor Redis para vários aplicativos do SignalR, use um prefixo de canal diferente para cada aplicativo do SignalR.

    Definir um prefixo de canal isola um aplicativo do SignalR de outros que usam prefixos de canal diferentes. Se você não atribuir prefixos diferentes, uma mensagem enviada de um aplicativo para todos os seus próprios clientes irá para todos os clientes de todos os aplicativos que usam o servidor Redis como um backplane.

  • Configure o software de balanceamento de carga do farm de servidores para sessões autoadesivas. Aqui estão alguns exemplos de documentação de como fazer isso:

Erros do servidor Redis

Quando um servidor Redis fica inativo, SignalR gera exceções que indicam que as mensagens não serão entregues. Algumas mensagens de exceção típicas:

  • Mensagem de gravação com falha
  • Falha ao invocar o método de hub "MethodName"
  • Falha na conexão com o Redis

SignalR não armazena mensagens em buffer para enviá-las quando o servidor retomar as atividades. Todas as mensagens enviadas enquanto o servidor Redis está inativo são perdidas.

SignalR reconecta automaticamente quando o servidor Redis estiver disponível novamente.

Comportamento personalizado para falhas de conexão

Aqui está um exemplo que mostra como lidar com eventos de falha de conexão do 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;
            };
        });

Cluster do Redis

O Cluster do Redis utiliza vários servidores Redis ativos simultaneamente para obter alta disponibilidade. Quando o Cluster do Redis é usado como o backplane para SignalR, as mensagens são entregues a todos os nós do cluster sem modificações de código no aplicativo.

Há uma compensação entre o número de nós no cluster e a taxa de transferência do backplane. Aumentar o número de nós aumenta a disponibilidade do cluster, mas diminui a taxa de transferência porque as mensagens devem ser transmitidas para todos os nós no cluster.

No aplicativo do SignalR, inclua todos os nós do Redis possíveis usando uma das seguintes abordagens:

  • Liste os nós na cadeia de conexão delimitada com vírgulas.
  • Se estiver usando o comportamento personalizado para falhas de conexão, adicione os nós a ConfigurationOptions.Endpoints.

Próximas etapas

Para saber mais, consulte os recursos a seguir:

Esse artigo explica aspectos específicos do SignalR da configuração de um servidor Redis a ser usado para dimensionar um aplicativo ASP.NET CoreSignalR.

Aviso

Este artigo mostra o uso de cadeias de conexão. Com um banco de dados local, o usuário não precisa ser autenticado, mas na produção, as cadeias de conexão às vezes incluem uma senha para autenticação. Uma credencial de senha do proprietário do recurso (ROPC) é um risco de segurança que deve ser evitado em bancos de dados de produção. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos implantados em ambientes de teste ou produção, consulte Fluxos de autenticação seguros.

Configurar um backplane do Redis

  • Implantar um servidor Redis.

    Importante

    Para uso em produção, um backplane do Redis é recomendado somente quando ele é executado no mesmo data center que o aplicativo SignalR. Caso contrário, a latência de rede degrada o desempenho. Se o aplicativo SignalR estiver em execução na nuvem do Azure, recomendamos o Serviço SignalR do Azure em vez de um backplane do Redis.

    Para saber mais, consulte os recursos a seguir:

  • No aplicativo SignalR, instale um dos seguintes pacotes NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Chame AddStackExchangeRedis adicionando a seguinte linha antes da linha que chama builder.Build()) no arquivo Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure as opções conforme necessário:

    A maioria das opções pode ser definida na cadeia de conexão ou no objeto ConfigurationOptions. As opções especificadas em ConfigurationOptions substituem as definidas na cadeia de conexão.

    O exemplo a seguir mostra como definir opções no objeto ConfigurationOptions. Esse exemplo adiciona um prefixo de canal para que vários aplicativos possam compartilhar a mesma instância do Redis, conforme explicado na etapa a seguir.

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

    No código anterior, options.Configuration é inicializado com o que foi especificado na cadeia de conexão.

    Para obter informações sobre as opções do Redis, consulte a documentação do StackExchange Redis.

  • Se você estiver usando um servidor Redis para vários aplicativos do SignalR, use um prefixo de canal diferente para cada aplicativo do SignalR.

    Definir um prefixo de canal isola um aplicativo do SignalR de outros que usam prefixos de canal diferentes. Se você não atribuir prefixos diferentes, uma mensagem enviada de um aplicativo para todos os seus próprios clientes irá para todos os clientes de todos os aplicativos que usam o servidor Redis como um backplane.

  • Configure o software de balanceamento de carga do farm de servidores para sessões autoadesivas. Aqui estão alguns exemplos de documentação de como fazer isso:

Erros do servidor Redis

Quando um servidor Redis fica inativo, SignalR gera exceções que indicam que as mensagens não serão entregues. Algumas mensagens de exceção típicas:

  • Mensagem de gravação com falha
  • Falha ao invocar o método de hub "MethodName"
  • Falha na conexão com o Redis

SignalR não armazena mensagens em buffer para enviá-las quando o servidor retomar as atividades. Todas as mensagens enviadas enquanto o servidor Redis está inativo são perdidas.

SignalR reconecta automaticamente quando o servidor Redis estiver disponível novamente.

Comportamento personalizado para falhas de conexão

Aqui está um exemplo que mostra como lidar com eventos de falha de conexão do 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;
            };
        });

Cluster do Redis

O Cluster do Redis utiliza vários servidores Redis ativos simultaneamente para obter alta disponibilidade. Quando o Cluster do Redis é usado como o backplane para SignalR, as mensagens são entregues a todos os nós do cluster sem modificações de código no aplicativo.

Há uma compensação entre o número de nós no cluster e a taxa de transferência do backplane. Aumentar o número de nós aumenta a disponibilidade do cluster, mas diminui a taxa de transferência porque as mensagens devem ser transmitidas para todos os nós no cluster.

No aplicativo do SignalR, inclua todos os nós do Redis possíveis usando uma das seguintes abordagens:

  • Liste os nós na cadeia de conexão delimitada com vírgulas.
  • Se estiver usando o comportamento personalizado para falhas de conexão, adicione os nós a ConfigurationOptions.Endpoints.

Próximas etapas

Para saber mais, consulte os recursos a seguir:

Esse artigo explica aspectos específicos do SignalR da configuração de um servidor Redis a ser usado para dimensionar um aplicativo ASP.NET CoreSignalR.

Aviso

Este artigo mostra o uso de cadeias de conexão. Com um banco de dados local, o usuário não precisa ser autenticado, mas na produção, as cadeias de conexão às vezes incluem uma senha para autenticação. Uma credencial de senha do proprietário do recurso (ROPC) é um risco de segurança que deve ser evitado em bancos de dados de produção. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos implantados em ambientes de teste ou produção, consulte Fluxos de autenticação seguros.

Configurar um backplane do Redis

  • Implantar um servidor Redis.

    Importante

    Para uso em produção, um backplane do Redis é recomendado somente quando ele é executado no mesmo data center que o aplicativo SignalR. Caso contrário, a latência de rede degrada o desempenho. Se o aplicativo SignalR estiver em execução na nuvem do Azure, recomendamos o Serviço SignalR do Azure em vez de um backplane do Redis.

    Para saber mais, consulte os recursos a seguir:

  • No aplicativo SignalR, instale um dos seguintes pacotes NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Chame AddStackExchangeRedis adicionando a seguinte linha antes da linha que chama builder.Build()) no arquivo Program.cs.

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure as opções conforme necessário:

    A maioria das opções pode ser definida na cadeia de conexão ou no objeto ConfigurationOptions. As opções especificadas em ConfigurationOptions substituem as definidas na cadeia de conexão.

    O exemplo a seguir mostra como definir opções no objeto ConfigurationOptions. Esse exemplo adiciona um prefixo de canal para que vários aplicativos possam compartilhar a mesma instância do Redis, conforme explicado na etapa a seguir.

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

    No código anterior, options.Configuration é inicializado com o que foi especificado na cadeia de conexão.

    Para obter informações sobre as opções do Redis, consulte a documentação do StackExchange Redis.

  • Se você estiver usando um servidor Redis para vários aplicativos do SignalR, use um prefixo de canal diferente para cada aplicativo do SignalR.

    Definir um prefixo de canal isola um aplicativo do SignalR de outros que usam prefixos de canal diferentes. Se você não atribuir prefixos diferentes, uma mensagem enviada de um aplicativo para todos os seus próprios clientes irá para todos os clientes de todos os aplicativos que usam o servidor Redis como um backplane.

  • Configure o software de balanceamento de carga do farm de servidores para sessões autoadesivas. Aqui estão alguns exemplos de documentação de como fazer isso:

Erros do servidor Redis

Quando um servidor Redis fica inativo, SignalR gera exceções que indicam que as mensagens não serão entregues. Algumas mensagens de exceção típicas:

  • Mensagem de gravação com falha
  • Falha ao invocar o método de hub "MethodName"
  • Falha na conexão com o Redis

SignalR não armazena mensagens em buffer para enviá-las quando o servidor retomar as atividades. Todas as mensagens enviadas enquanto o servidor Redis está inativo são perdidas.

SignalR reconecta automaticamente quando o servidor Redis estiver disponível novamente.

Comportamento personalizado para falhas de conexão

Aqui está um exemplo que mostra como lidar com eventos de falha de conexão do 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;
            };
        });

Cluster do Redis

O Cluster do Redis utiliza vários servidores Redis ativos simultaneamente para obter alta disponibilidade. Quando o Cluster do Redis é usado como o backplane para SignalR, as mensagens são entregues a todos os nós do cluster sem modificações de código no aplicativo.

Há uma compensação entre o número de nós no cluster e a taxa de transferência do backplane. Aumentar o número de nós aumenta a disponibilidade do cluster, mas diminui a taxa de transferência porque as mensagens devem ser transmitidas para todos os nós no cluster.

No aplicativo do SignalR, inclua todos os nós do Redis possíveis usando uma das seguintes abordagens:

  • Liste os nós na cadeia de conexão delimitada com vírgulas.
  • Se estiver usando o comportamento personalizado para falhas de conexão, adicione os nós a ConfigurationOptions.Endpoints.

Próximas etapas

Para saber mais, consulte os recursos a seguir:

Esse artigo explica aspectos específicos do SignalR da configuração de um servidor Redis a ser usado para dimensionar um aplicativo ASP.NET CoreSignalR.

Aviso

Este artigo mostra o uso de cadeias de conexão. Com um banco de dados local, o usuário não precisa ser autenticado, mas na produção, as cadeias de conexão às vezes incluem uma senha para autenticação. Uma credencial de senha do proprietário do recurso (ROPC) é um risco de segurança que deve ser evitado em bancos de dados de produção. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos implantados em ambientes de teste ou produção, consulte Fluxos de autenticação seguros.

Configurar um backplane do Redis

  • Implantar um servidor Redis.

    Importante

    Para uso em produção, um backplane do Redis é recomendado somente quando ele é executado no mesmo data center que o aplicativo SignalR. Caso contrário, a latência de rede degrada o desempenho. Se o aplicativo SignalR estiver em execução na nuvem do Azure, recomendamos o Serviço SignalR do Azure em vez de um backplane do Redis.

    Para saber mais, consulte os recursos a seguir:

  • No aplicativo SignalR, instale um dos seguintes pacotes NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • No método Startup.ConfigureServices, chame AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure as opções conforme necessário:

    A maioria das opções pode ser definida na cadeia de conexão ou no objeto ConfigurationOptions. As opções especificadas em ConfigurationOptions substituem as definidas na cadeia de conexão.

    O exemplo a seguir mostra como definir opções no objeto ConfigurationOptions. Esse exemplo adiciona um prefixo de canal para que vários aplicativos possam compartilhar a mesma instância do Redis, conforme explicado na etapa a seguir.

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

    No código anterior, options.Configuration é inicializado com o que foi especificado na cadeia de conexão.

    Para obter informações sobre as opções do Redis, consulte a documentação do StackExchange Redis.

  • Se você estiver usando um servidor Redis para vários aplicativos do SignalR, use um prefixo de canal diferente para cada aplicativo do SignalR.

    Definir um prefixo de canal isola um aplicativo do SignalR de outros que usam prefixos de canal diferentes. Se você não atribuir prefixos diferentes, uma mensagem enviada de um aplicativo para todos os seus próprios clientes irá para todos os clientes de todos os aplicativos que usam o servidor Redis como um backplane.

  • Configure o software de balanceamento de carga do farm de servidores para sessões autoadesivas. Aqui estão alguns exemplos de documentação de como fazer isso:

Erros do servidor Redis

Quando um servidor Redis fica inativo, SignalR gera exceções que indicam que as mensagens não serão entregues. Algumas mensagens de exceção típicas:

  • Mensagem de gravação com falha
  • Falha ao invocar o método de hub "MethodName"
  • Falha na conexão com o Redis

SignalR não armazena mensagens em buffer para enviá-las quando o servidor retomar as atividades. Todas as mensagens enviadas enquanto o servidor Redis está inativo são perdidas.

SignalR reconecta automaticamente quando o servidor Redis estiver disponível novamente.

Comportamento personalizado para falhas de conexão

Aqui está um exemplo que mostra como lidar com eventos de falha de conexão do 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;
            };
        });

Cluster do Redis

O Cluster do Redis utiliza vários servidores Redis ativos simultaneamente para obter alta disponibilidade. Quando o Cluster do Redis é usado como o backplane para SignalR, as mensagens são entregues a todos os nós do cluster sem modificações de código no aplicativo.

Há uma compensação entre o número de nós no cluster e a taxa de transferência do backplane. Aumentar o número de nós aumenta a disponibilidade do cluster, mas diminui a taxa de transferência porque as mensagens devem ser transmitidas para todos os nós no cluster.

No aplicativo do SignalR, inclua todos os nós do Redis possíveis usando uma das seguintes abordagens:

  • Liste os nós na cadeia de conexão delimitada com vírgulas.
  • Se estiver usando o comportamento personalizado para falhas de conexão, adicione os nós a ConfigurationOptions.Endpoints.

Próximas etapas

Para saber mais, consulte os recursos a seguir:

Esse artigo explica aspectos específicos do SignalR da configuração de um servidor Redis a ser usado para dimensionar um aplicativo ASP.NET CoreSignalR.

Aviso

Este artigo mostra o uso de cadeias de conexão. Com um banco de dados local, o usuário não precisa ser autenticado, mas na produção, as cadeias de conexão às vezes incluem uma senha para autenticação. Uma credencial de senha do proprietário do recurso (ROPC) é um risco de segurança que deve ser evitado em bancos de dados de produção. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos implantados em ambientes de teste ou produção, consulte Fluxos de autenticação seguros.

Configurar um backplane do Redis

  • Implantar um servidor Redis.

    Importante

    Para uso em produção, um backplane do Redis é recomendado somente quando ele é executado no mesmo data center que o aplicativo SignalR. Caso contrário, a latência de rede degrada o desempenho. Se o aplicativo SignalR estiver em execução na nuvem do Azure, recomendamos o Serviço SignalR do Azure em vez de um backplane do Redis.

    Para saber mais, consulte os recursos a seguir:

  • No aplicativo SignalR, instale um dos seguintes pacotes NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • No método Startup.ConfigureServices, chame AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configure as opções conforme necessário:

    A maioria das opções pode ser definida na cadeia de conexão ou no objeto ConfigurationOptions. As opções especificadas em ConfigurationOptions substituem as definidas na cadeia de conexão.

    O exemplo a seguir mostra como definir opções no objeto ConfigurationOptions. Esse exemplo adiciona um prefixo de canal para que vários aplicativos possam compartilhar a mesma instância do Redis, conforme explicado na etapa a seguir.

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

    No código anterior, options.Configuration é inicializado com o que foi especificado na cadeia de conexão.

    Para obter informações sobre as opções do Redis, consulte a documentação do StackExchange Redis.

  • Se você estiver usando um servidor Redis para vários aplicativos do SignalR, use um prefixo de canal diferente para cada aplicativo do SignalR.

    Definir um prefixo de canal isola um aplicativo do SignalR de outros que usam prefixos de canal diferentes. Se você não atribuir prefixos diferentes, uma mensagem enviada de um aplicativo para todos os seus próprios clientes irá para todos os clientes de todos os aplicativos que usam o servidor Redis como um backplane.

  • Configure o software de balanceamento de carga do farm de servidores para sessões autoadesivas. Aqui estão alguns exemplos de documentação de como fazer isso:

Erros do servidor Redis

Quando um servidor Redis fica inativo, SignalR gera exceções que indicam que as mensagens não serão entregues. Algumas mensagens de exceção típicas:

  • Mensagem de gravação com falha
  • Falha ao invocar o método de hub "MethodName"
  • Falha na conexão com o Redis

SignalR não armazena mensagens em buffer para enviá-las quando o servidor retomar as atividades. Todas as mensagens enviadas enquanto o servidor Redis está inativo são perdidas.

SignalR reconecta automaticamente quando o servidor Redis estiver disponível novamente.

Comportamento personalizado para falhas de conexão

Aqui está um exemplo que mostra como lidar com eventos de falha de conexão do 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;
            };
        });

Cluster do Redis

O Cluster do Redis utiliza vários servidores Redis ativos simultaneamente para obter alta disponibilidade. Quando o Cluster do Redis é usado como o backplane para SignalR, as mensagens são entregues a todos os nós do cluster sem modificações de código no aplicativo.

Há uma compensação entre o número de nós no cluster e a taxa de transferência do backplane. Aumentar o número de nós aumenta a disponibilidade do cluster, mas diminui a taxa de transferência porque as mensagens devem ser transmitidas para todos os nós no cluster.

No aplicativo do SignalR, inclua todos os nós do Redis possíveis usando uma das seguintes abordagens:

  • Liste os nós na cadeia de conexão delimitada com vírgulas.
  • Se estiver usando o comportamento personalizado para falhas de conexão, adicione os nós a ConfigurationOptions.Endpoints.

Próximas etapas

Para saber mais, consulte os recursos a seguir:

Esse artigo explica aspectos específicos do SignalR da configuração de um servidor Redis a ser usado para dimensionar um aplicativo ASP.NET CoreSignalR.

Aviso

Este artigo mostra o uso de cadeias de conexão. Com um banco de dados local, o usuário não precisa ser autenticado, mas na produção, as cadeias de conexão às vezes incluem uma senha para autenticação. Uma credencial de senha do proprietário do recurso (ROPC) é um risco de segurança que deve ser evitado em bancos de dados de produção. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos implantados em ambientes de teste ou produção, consulte Fluxos de autenticação seguros.

Configurar um backplane do Redis

  • Implantar um servidor Redis.

    Importante

    Para uso em produção, um backplane do Redis é recomendado somente quando ele é executado no mesmo data center que o aplicativo SignalR. Caso contrário, a latência de rede degrada o desempenho. Se o aplicativo SignalR estiver em execução na nuvem do Azure, recomendamos o Serviço SignalR do Azure em vez de um backplane do Redis.

    Para saber mais, consulte os recursos a seguir:

  • No aplicativo SignalR, instale um dos seguintes pacotes NuGet:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis: Depende do StackExchange.Redis 2.X.X. Esse é o pacote recomendado para ASP.NET Core 2.2 e posterior.
    • Microsoft.AspNetCore.SignalR.Redis: Depende do StackExchange.Redis 1.X.X. Esse pacote não está incluído no ASP.NET Core 3.0 e posterior.
  • No método Startup.ConfigureServices, chame AddStackExchangeRedis:

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

Ao usar Microsoft.AspNetCore.SignalR.Redis, chame AddRedis.

  • Configure as opções conforme necessário:

    A maioria das opções pode ser definida na cadeia de conexão ou no objeto ConfigurationOptions . As opções especificadas em ConfigurationOptions substituem as definidas na cadeia de conexão.

    O exemplo a seguir mostra como definir opções no objeto ConfigurationOptions. Esse exemplo adiciona um prefixo de canal para que vários aplicativos possam compartilhar a mesma instância do Redis, conforme explicado na etapa a seguir.

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

Ao usar Microsoft.AspNetCore.SignalR.Redis, chame AddRedis.

No código anterior, options.Configuration é inicializado com o que foi especificado na cadeia de conexão.

Para obter informações sobre as opções do Redis, consulte a documentação do StackExchange Redis.

  • Se você estiver usando um servidor Redis para vários aplicativos do SignalR, use um prefixo de canal diferente para cada aplicativo do SignalR.

    Definir um prefixo de canal isola um aplicativo do SignalR de outros que usam prefixos de canal diferentes. Se você não atribuir prefixos diferentes, uma mensagem enviada de um aplicativo para todos os seus próprios clientes irá para todos os clientes de todos os aplicativos que usam o servidor Redis como um backplane.

  • Configure o software de balanceamento de carga do farm de servidores para sessões autoadesivas. Aqui estão alguns exemplos de documentação de como fazer isso:

Erros do servidor Redis

Quando um servidor Redis fica inativo, SignalR gera exceções que indicam que as mensagens não serão entregues. Algumas mensagens de exceção típicas:

  • Mensagem de gravação com falha
  • Falha ao invocar o método de hub "MethodName"
  • Falha na conexão com o Redis

SignalR não armazena mensagens em buffer para enviá-las quando o servidor retomar as atividades. Todas as mensagens enviadas enquanto o servidor Redis está inativo são perdidas.

SignalR reconecta automaticamente quando o servidor Redis estiver disponível novamente.

Comportamento personalizado para falhas de conexão

Aqui está um exemplo que mostra como lidar com eventos de falha de conexão do 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;
            };
        });

Cluster do Redis

O Cluster do Redis utiliza vários servidores Redis ativos simultaneamente para obter alta disponibilidade. Quando o Cluster do Redis é usado como o backplane para SignalR, as mensagens são entregues a todos os nós do cluster sem modificações de código no aplicativo.

Há uma compensação entre o número de nós no cluster e a taxa de transferência do backplane. Aumentar o número de nós aumenta a disponibilidade do cluster, mas diminui a taxa de transferência porque as mensagens devem ser transmitidas para todos os nós no cluster.

No aplicativo do SignalR, inclua todos os nós do Redis possíveis usando uma das seguintes abordagens:

  • Liste os nós na cadeia de conexão delimitada com vírgulas.
  • Se estiver usando o comportamento personalizado para falhas de conexão, adicione os nós a ConfigurationOptions.Endpoints.

Próximas etapas

Para saber mais, consulte os recursos a seguir:

Esse artigo explica aspectos específicos do SignalR da configuração de um servidor Redis a ser usado para dimensionar um aplicativo ASP.NET CoreSignalR.

Aviso

Este artigo mostra o uso de cadeias de conexão. Com um banco de dados local, o usuário não precisa ser autenticado, mas na produção, as cadeias de conexão às vezes incluem uma senha para autenticação. Uma credencial de senha do proprietário do recurso (ROPC) é um risco de segurança que deve ser evitado em bancos de dados de produção. Os aplicativos de produção devem usar o fluxo de autenticação mais seguro disponível. Para obter mais informações sobre autenticação para aplicativos implantados em ambientes de teste ou produção, consulte Fluxos de autenticação seguros.

Configurar um backplane do Redis

  • Implantar um servidor Redis.

    Importante

    Para uso em produção, um backplane do Redis é recomendado somente quando ele é executado no mesmo data center que o aplicativo SignalR. Caso contrário, a latência de rede degrada o desempenho. Se o aplicativo SignalR estiver em execução na nuvem do Azure, recomendamos o Serviço SignalR do Azure em vez de um backplane do Redis.

    Para saber mais, consulte os recursos a seguir:

  • No aplicativo SignalR, instale o pacote NuGet do Microsoft.AspNetCore.SignalR.Redis.

  • No método Startup.ConfigureServices, chame AddRedis após AddSignalR:

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • Configure as opções conforme necessário:

    A maioria das opções pode ser definida na cadeia de conexão ou no objeto ConfigurationOptions . As opções especificadas em ConfigurationOptions substituem as definidas na cadeia de conexão.

    O exemplo a seguir mostra como definir opções no objeto ConfigurationOptions. Esse exemplo adiciona um prefixo de canal para que vários aplicativos possam compartilhar a mesma instância do Redis, conforme explicado na etapa a seguir.

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

    No código anterior, options.Configuration é inicializado com o que foi especificado na cadeia de conexão.

  • Se você estiver usando um servidor Redis para vários aplicativos do SignalR, use um prefixo de canal diferente para cada aplicativo do SignalR.

    Definir um prefixo de canal isola um aplicativo do SignalR de outros que usam prefixos de canal diferentes. Se você não atribuir prefixos diferentes, uma mensagem enviada de um aplicativo para todos os seus próprios clientes irá para todos os clientes de todos os aplicativos que usam o servidor Redis como um backplane.

  • Configure o software de balanceamento de carga do farm de servidores para sessões autoadesivas. Aqui estão alguns exemplos de documentação de como fazer isso:

Erros do servidor Redis

Quando um servidor Redis fica inativo, SignalR gera exceções que indicam que as mensagens não serão entregues. Algumas mensagens de exceção típicas:

  • Mensagem de gravação com falha
  • Falha ao invocar o método de hub "MethodName"
  • Falha na conexão com o Redis

SignalR não armazena mensagens em buffer para enviá-las quando o servidor retomar as atividades. Todas as mensagens enviadas enquanto o servidor Redis está inativo são perdidas.

SignalR reconecta automaticamente quando o servidor Redis estiver disponível novamente.

Comportamento personalizado para falhas de conexão

Aqui está um exemplo que mostra como lidar com eventos de falha de conexão do 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;
            };
        });

Cluster do Redis

O Cluster do Redis utiliza vários servidores Redis ativos simultaneamente para obter alta disponibilidade. Quando o Cluster do Redis é usado como o backplane para SignalR, as mensagens são entregues a todos os nós do cluster sem modificações de código no aplicativo.

Há uma compensação entre o número de nós no cluster e a taxa de transferência do backplane. Aumentar o número de nós aumenta a disponibilidade do cluster, mas diminui a taxa de transferência porque as mensagens devem ser transmitidas para todos os nós no cluster.

No aplicativo do SignalR, inclua todos os nós do Redis possíveis usando uma das seguintes abordagens:

  • Liste os nós na cadeia de conexão delimitada com vírgulas.
  • Se estiver usando o comportamento personalizado para falhas de conexão, adicione os nós a ConfigurationOptions.Endpoints.

Próximas etapas

Para saber mais, consulte os recursos a seguir: