Configurare un backplane Redis per la SignalR scalabilità orizzontale di ASP.NET CoreSet up a Redis backplane for ASP.NET Core SignalR scale-out

Di Andrew Stanton-Nurse, Brady Gastere Tom Dykstra,By Andrew Stanton-Nurse, Brady Gaster, and Tom Dykstra,

Questo articolo illustra SignalR gli aspetti specifici della configurazione di un server Redis da usare per la scalabilità orizzontale di un' SignalR app ASP.NET Core.This article explains SignalR-specific aspects of setting up a Redis server to use for scaling out an ASP.NET Core SignalR app.

Configurare un backplane RedisSet up a Redis backplane

  • Distribuire un server Redis.Deploy a Redis server.

    Importante

    Per l'uso in produzione, è consigliabile un backplane Redis solo quando viene eseguito nella stessa data center dell' SignalR app.For production use, a Redis backplane is recommended only when it runs in the same data center as the SignalR app. In caso contrario, la latenza di rete comporta un peggioramento delle prestazioni.Otherwise, network latency degrades performance. Se l' SignalR app è in esecuzione nel cloud di Azure, è consigliabile usare il SignalR servizio di Azure invece di un backplane di Redis.If your SignalR app is running in the Azure cloud, we recommend Azure SignalR Service instead of a Redis backplane. È possibile usare il servizio cache Redis di Azure per gli ambienti di sviluppo e test.You can use the Azure Redis Cache Service for development and test environments.

    Per altre informazioni, vedere le seguenti risorse:For more information, see the following resources:

  • Nell' SignalR app installare il Microsoft.AspNetCore.SignalR.Redis pacchetto NuGet.In the SignalR app, install the Microsoft.AspNetCore.SignalR.Redis NuGet package.

  • Nel Startup.ConfigureServices metodo chiamare AddRedis dopo AddSignalR :In the Startup.ConfigureServices method, call AddRedis after AddSignalR:

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • Configurare le opzioni in base alle esigenze:Configure options as needed:

    La maggior parte delle opzioni può essere impostata nella stringa di connessione o nell'oggetto ConfigurationOptions .Most options can be set in the connection string or in the ConfigurationOptions object. Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.Options specified in ConfigurationOptions override the ones set in the connection string.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell' ConfigurationOptions oggetto.The following example shows how to set options in the ConfigurationOptions object. Questo esempio aggiunge un prefisso del canale in modo che più app possano condividere la stessa istanza di redis, come illustrato nel passaggio seguente.This example adds a channel prefix so that multiple apps can share the same Redis instance, as explained in the following step.

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

    Nel codice precedente, options.Configuration viene inizializzato con qualsiasi oggetto specificato nella stringa di connessione.In the preceding code, options.Configuration is initialized with whatever was specified in the connection string.

  • Nell' SignalR app installare uno dei pacchetti NuGet seguenti:In the SignalR app, install one of the following NuGet packages:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis-Dipende da StackExchange. Redis 2. X.X.Microsoft.AspNetCore.SignalR.StackExchangeRedis - Depends on StackExchange.Redis 2.X.X. Questo è il pacchetto consigliato per ASP.NET Core 2,2 e versioni successive.This is the recommended package for ASP.NET Core 2.2 and later.
    • Microsoft.AspNetCore.SignalR.Redis-Dipende da StackExchange. Redis 1. X.X.Microsoft.AspNetCore.SignalR.Redis - Depends on StackExchange.Redis 1.X.X. Questo pacchetto non è incluso in ASP.NET Core 3,0 e versioni successive.This package isn't included in ASP.NET Core 3.0 and later.
  • Nel Startup.ConfigureServices metodo chiamare AddStackExchangeRedis :In the Startup.ConfigureServices method, call AddStackExchangeRedis:

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

Quando si usa Microsoft.AspNetCore.SignalR.Redis , chiamare AddRedis .When using Microsoft.AspNetCore.SignalR.Redis, call AddRedis.

  • Configurare le opzioni in base alle esigenze:Configure options as needed:

    La maggior parte delle opzioni può essere impostata nella stringa di connessione o nell'oggetto ConfigurationOptions .Most options can be set in the connection string or in the ConfigurationOptions object. Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.Options specified in ConfigurationOptions override the ones set in the connection string.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell' ConfigurationOptions oggetto.The following example shows how to set options in the ConfigurationOptions object. Questo esempio aggiunge un prefisso del canale in modo che più app possano condividere la stessa istanza di redis, come illustrato nel passaggio seguente.This example adds a channel prefix so that multiple apps can share the same Redis instance, as explained in the following step.

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

Quando si usa Microsoft.AspNetCore.SignalR.Redis , chiamare AddRedis .When using Microsoft.AspNetCore.SignalR.Redis, call AddRedis.

Nel codice precedente, options.Configuration viene inizializzato con qualsiasi oggetto specificato nella stringa di connessione.In the preceding code, options.Configuration is initialized with whatever was specified in the connection string.

Per informazioni sulle opzioni di redis, vedere la documentazione su Redis di stackexchange.For information about Redis options, see the StackExchange Redis documentation.

  • Nell' SignalR app installare il pacchetto NuGet seguente:In the SignalR app, install the following NuGet package:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Nel Startup.ConfigureServices metodo chiamare AddStackExchangeRedis :In the Startup.ConfigureServices method, call AddStackExchangeRedis:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configurare le opzioni in base alle esigenze:Configure options as needed:

    La maggior parte delle opzioni può essere impostata nella stringa di connessione o nell'oggetto ConfigurationOptions .Most options can be set in the connection string or in the ConfigurationOptions object. Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.Options specified in ConfigurationOptions override the ones set in the connection string.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell' ConfigurationOptions oggetto.The following example shows how to set options in the ConfigurationOptions object. Questo esempio aggiunge un prefisso del canale in modo che più app possano condividere la stessa istanza di redis, come illustrato nel passaggio seguente.This example adds a channel prefix so that multiple apps can share the same Redis instance, as explained in the following step.

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

    Nel codice precedente, options.Configuration viene inizializzato con qualsiasi oggetto specificato nella stringa di connessione.In the preceding code, options.Configuration is initialized with whatever was specified in the connection string.

    Per informazioni sulle opzioni di redis, vedere la documentazione su Redis di stackexchange.For information about Redis options, see the StackExchange Redis documentation.

  • Se si usa un server Redis per più SignalR app, usare un prefisso di canale diverso per ogni SignalR app.If you're using one Redis server for multiple SignalR apps, use a different channel prefix for each SignalR app.

    L'impostazione di un prefisso del canale isola un' SignalR app da altre che usano prefissi di canale diversi.Setting a channel prefix isolates one SignalR app from others that use different channel prefixes. Se non si assegnano prefissi diversi, un messaggio inviato da un'app a tutti i relativi client passerà a tutti i client di tutte le app che usano il server Redis come backplane.If you don't assign different prefixes, a message sent from one app to all of its own clients will go to all clients of all apps that use the Redis server as a backplane.

  • Configurare il software di bilanciamento del carico server farm per le sessioni permanenti.Configure your server farm load balancing software for sticky sessions. Di seguito sono riportati alcuni esempi di documentazione su come eseguire questa operazione:Here are some examples of documentation on how to do that:

Errori del server RedisRedis server errors

Quando un server Redis diventa inattivo, SignalR genera eccezioni che indicano che i messaggi non vengono recapitati.When a Redis server goes down, SignalR throws exceptions that indicate messages won't be delivered. Alcuni messaggi di eccezione tipici:Some typical exception messages:

  • Scrittura del messaggio non riuscitaFailed writing message
  • Non è stato possibile richiamare il metodo Hub ' MethodName 'Failed to invoke hub method 'MethodName'
  • Connessione a Redis non riuscitaConnection to Redis failed

SignalRnon memorizza nel buffer i messaggi per inviarli quando viene restituito il server. doesn't buffer messages to send them when the server comes back up. Tutti i messaggi inviati durante il server Redis vengono persi.Any messages sent while the Redis server is down are lost.

SignalRsi riconnette automaticamente quando il server Redis è nuovamente disponibile. automatically reconnects when the Redis server is available again.

Comportamento personalizzato per gli errori di connessioneCustom behavior for connection failures

Ecco un esempio che illustra come gestire gli eventi di errore di connessione Redis.Here's an example that shows how to handle Redis connection failure events.

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;
            };
        });
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;
            };
        });

Clustering di redisRedis Clustering

Il clustering di redis è un metodo per ottenere la disponibilità elevata usando più server Redis.Redis Clustering is a method for achieving high availability by using multiple Redis servers. Il clustering non è ufficialmente supportato, ma potrebbe funzionare.Clustering isn't officially supported, but it might work.

Passaggi successiviNext steps

Per altre informazioni, vedere le seguenti risorse:For more information, see the following resources: