Condividi tramite


Configurare un backplane Redis per la scalabilità orizzontale di ASP.NET Core SignalR

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

Questo articolo illustra SignalRaspetti specifici della configurazione di un server Redis da usare per aumentare il numero di istanze di un'app ASP.NET Core SignalR .

Avviso

Questo articolo illustra l'uso di stringa di connessione. Con un database locale l'utente non deve essere autenticato, ma nell'ambiente di produzione stringa di connessione talvolta include una password per l'autenticazione. Una credenziale della password del proprietario della risorsa (ROPC) è un rischio per la sicurezza che deve essere evitato nei database di produzione. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app distribuite in ambienti di test o di produzione, vedere Proteggere i flussi di autenticazione.

Configurare un backplane Redis

  • Distribuire un server Redis.

    Importante

    Per l'uso in produzione, è consigliabile usare un backplane Redis solo quando viene eseguito nello stesso data center dell'app SignalR . In caso contrario, la latenza di rete degrada le prestazioni. SignalR Se l'app è in esecuzione nel cloud di Azure, è consigliabile usare il servizio di Azure SignalR anziché un backplane Redis.

    Per ulteriori informazioni, vedi le seguenti risorse:

  • Nell'app SignalR installare il pacchetto NuGet seguente:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Chiamare AddStackExchangeRedis aggiungendo la riga seguente prima della riga che chiama builder.Build()) nel Program.cs file .

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configurare le opzioni in base alle esigenze:

    La maggior parte delle opzioni può essere impostata nel stringa di connessione o nell'oggetto ConfigurationOptions . Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell'oggetto ConfigurationOptions . In questo esempio viene aggiunto un prefisso del canale in modo che più app possano condividere la stessa istanza di Redis, come illustrato nel passaggio seguente.

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

    Nel codice precedente, options.Configuration viene inizializzato con qualsiasi elemento specificato nella stringa di connessione.

    Per informazioni sulle opzioni di Redis, vedere la documentazione di StackExchange Redis.

  • Se si usa un server Redis per più SignalR app, usare un prefisso di canale diverso per ogni SignalR app.

    L'impostazione di un prefisso del canale isola un'app SignalR da altre che usano prefissi di canale diversi. Se non si assegnano prefissi diversi, un messaggio inviato da un'app a tutti i propri client passerà a tutti i client di tutte le app che usano il server Redis come backplane.

  • Configurare il software di bilanciamento del carico della server farm per sessioni permanenti. Ecco alcuni esempi di documentazione su come eseguire questa operazione:

Errori del server Redis

Quando un server Redis diventa inattivo, SignalR genera eccezioni che indicano che i messaggi non verranno recapitati. Alcuni messaggi di eccezione tipici:

  • Messaggio di scrittura non riuscito
  • Impossibile richiamare il metodo hub 'MethodName'
  • Connessione a Redis non riuscita

SignalR non memorizza nel buffer i messaggi da inviare quando viene eseguito il backup del server. Tutti i messaggi inviati mentre il server Redis è inattivo vengono persi.

SignalR si riconnette automaticamente quando il server Redis è nuovamente disponibile.

Comportamento personalizzato per gli errori di connessione

Ecco un esempio che illustra come gestire gli eventi di errore di connessione 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 Redis

Il cluster Redis usa più server Redis attivi contemporaneamente per ottenere disponibilità elevata. Quando il cluster Redis viene usato come backplane per SignalR, i messaggi vengono recapitati a tutti i nodi del cluster senza apportare modifiche al codice all'app.

Esiste un compromesso tra il numero di nodi nel cluster e la velocità effettiva del backplane. L'aumento del numero di nodi aumenta la disponibilità del cluster, ma riduce la velocità effettiva perché i messaggi devono essere trasmessi a tutti i nodi del cluster.

Nell'app SignalR includere tutti i possibili nodi Redis usando uno degli approcci seguenti:

  • Elencare i nodi nella stringa di connessione delimitati da virgole.
  • Se si usa un comportamento personalizzato per gli errori di connessione, aggiungere i nodi a ConfigurationOptions.Endpoints.

Passaggi successivi

Per ulteriori informazioni, vedi le seguenti risorse:

Questo articolo illustra SignalRaspetti specifici della configurazione di un server Redis da usare per aumentare il numero di istanze di un'app ASP.NET Core SignalR .

Avviso

Questo articolo illustra l'uso di stringa di connessione. Con un database locale l'utente non deve essere autenticato, ma nell'ambiente di produzione stringa di connessione talvolta include una password per l'autenticazione. Una credenziale della password del proprietario della risorsa (ROPC) è un rischio per la sicurezza che deve essere evitato nei database di produzione. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app distribuite in ambienti di test o di produzione, vedere Proteggere i flussi di autenticazione.

Configurare un backplane Redis

  • Distribuire un server Redis.

    Importante

    Per l'uso in produzione, è consigliabile usare un backplane Redis solo quando viene eseguito nello stesso data center dell'app SignalR . In caso contrario, la latenza di rete degrada le prestazioni. SignalR Se l'app è in esecuzione nel cloud di Azure, è consigliabile usare il servizio di Azure SignalR anziché un backplane Redis.

    Per ulteriori informazioni, vedi le seguenti risorse:

  • Nell'app SignalR installare il pacchetto NuGet seguente:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Chiamare AddStackExchangeRedis aggiungendo la riga seguente prima della riga che chiama builder.Build()) nel Program.cs file .

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configurare le opzioni in base alle esigenze:

    La maggior parte delle opzioni può essere impostata nel stringa di connessione o nell'oggetto ConfigurationOptions . Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell'oggetto ConfigurationOptions . In questo esempio viene aggiunto un prefisso del canale in modo che più app possano condividere la stessa istanza di Redis, come illustrato nel passaggio seguente.

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

    Nel codice precedente, options.Configuration viene inizializzato con qualsiasi elemento specificato nella stringa di connessione.

    Per informazioni sulle opzioni di Redis, vedere la documentazione di StackExchange Redis.

  • Se si usa un server Redis per più SignalR app, usare un prefisso di canale diverso per ogni SignalR app.

    L'impostazione di un prefisso del canale isola un'app SignalR da altre che usano prefissi di canale diversi. Se non si assegnano prefissi diversi, un messaggio inviato da un'app a tutti i propri client passerà a tutti i client di tutte le app che usano il server Redis come backplane.

  • Configurare il software di bilanciamento del carico della server farm per sessioni permanenti. Ecco alcuni esempi di documentazione su come eseguire questa operazione:

Errori del server Redis

Quando un server Redis diventa inattivo, SignalR genera eccezioni che indicano che i messaggi non verranno recapitati. Alcuni messaggi di eccezione tipici:

  • Messaggio di scrittura non riuscito
  • Impossibile richiamare il metodo hub 'MethodName'
  • Connessione a Redis non riuscita

SignalR non memorizza nel buffer i messaggi da inviare quando viene eseguito il backup del server. Tutti i messaggi inviati mentre il server Redis è inattivo vengono persi.

SignalR si riconnette automaticamente quando il server Redis è nuovamente disponibile.

Comportamento personalizzato per gli errori di connessione

Ecco un esempio che illustra come gestire gli eventi di errore di connessione 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 Redis

Il cluster Redis usa più server Redis attivi contemporaneamente per ottenere disponibilità elevata. Quando il cluster Redis viene usato come backplane per SignalR, i messaggi vengono recapitati a tutti i nodi del cluster senza apportare modifiche al codice all'app.

Esiste un compromesso tra il numero di nodi nel cluster e la velocità effettiva del backplane. L'aumento del numero di nodi aumenta la disponibilità del cluster, ma riduce la velocità effettiva perché i messaggi devono essere trasmessi a tutti i nodi del cluster.

Nell'app SignalR includere tutti i possibili nodi Redis usando uno degli approcci seguenti:

  • Elencare i nodi nella stringa di connessione delimitati da virgole.
  • Se si usa un comportamento personalizzato per gli errori di connessione, aggiungere i nodi a ConfigurationOptions.Endpoints.

Passaggi successivi

Per ulteriori informazioni, vedi le seguenti risorse:

Questo articolo illustra SignalRaspetti specifici della configurazione di un server Redis da usare per aumentare il numero di istanze di un'app ASP.NET Core SignalR .

Avviso

Questo articolo illustra l'uso di stringa di connessione. Con un database locale l'utente non deve essere autenticato, ma nell'ambiente di produzione stringa di connessione talvolta include una password per l'autenticazione. Una credenziale della password del proprietario della risorsa (ROPC) è un rischio per la sicurezza che deve essere evitato nei database di produzione. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app distribuite in ambienti di test o di produzione, vedere Proteggere i flussi di autenticazione.

Configurare un backplane Redis

  • Distribuire un server Redis.

    Importante

    Per l'uso in produzione, è consigliabile usare un backplane Redis solo quando viene eseguito nello stesso data center dell'app SignalR . In caso contrario, la latenza di rete degrada le prestazioni. SignalR Se l'app è in esecuzione nel cloud di Azure, è consigliabile usare il servizio di Azure SignalR anziché un backplane Redis.

    Per ulteriori informazioni, vedi le seguenti risorse:

  • Nell'app SignalR installare il pacchetto NuGet seguente:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Chiamare AddStackExchangeRedis aggiungendo la riga seguente prima della riga che chiama builder.Build()) nel Program.cs file .

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Configurare le opzioni in base alle esigenze:

    La maggior parte delle opzioni può essere impostata nel stringa di connessione o nell'oggetto ConfigurationOptions . Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell'oggetto ConfigurationOptions . In questo esempio viene aggiunto un prefisso del canale in modo che più app possano condividere la stessa istanza di Redis, come illustrato nel passaggio seguente.

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

    Nel codice precedente, options.Configuration viene inizializzato con qualsiasi elemento specificato nella stringa di connessione.

    Per informazioni sulle opzioni di Redis, vedere la documentazione di StackExchange Redis.

  • Se si usa un server Redis per più SignalR app, usare un prefisso di canale diverso per ogni SignalR app.

    L'impostazione di un prefisso del canale isola un'app SignalR da altre che usano prefissi di canale diversi. Se non si assegnano prefissi diversi, un messaggio inviato da un'app a tutti i propri client passerà a tutti i client di tutte le app che usano il server Redis come backplane.

  • Configurare il software di bilanciamento del carico della server farm per sessioni permanenti. Ecco alcuni esempi di documentazione su come eseguire questa operazione:

Errori del server Redis

Quando un server Redis diventa inattivo, SignalR genera eccezioni che indicano che i messaggi non verranno recapitati. Alcuni messaggi di eccezione tipici:

  • Messaggio di scrittura non riuscito
  • Impossibile richiamare il metodo hub 'MethodName'
  • Connessione a Redis non riuscita

SignalR non memorizza nel buffer i messaggi da inviare quando viene eseguito il backup del server. Tutti i messaggi inviati mentre il server Redis è inattivo vengono persi.

SignalR si riconnette automaticamente quando il server Redis è nuovamente disponibile.

Comportamento personalizzato per gli errori di connessione

Ecco un esempio che illustra come gestire gli eventi di errore di connessione 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 Redis

Il cluster Redis usa più server Redis attivi contemporaneamente per ottenere disponibilità elevata. Quando il cluster Redis viene usato come backplane per SignalR, i messaggi vengono recapitati a tutti i nodi del cluster senza apportare modifiche al codice all'app.

Esiste un compromesso tra il numero di nodi nel cluster e la velocità effettiva del backplane. L'aumento del numero di nodi aumenta la disponibilità del cluster, ma riduce la velocità effettiva perché i messaggi devono essere trasmessi a tutti i nodi del cluster.

Nell'app SignalR includere tutti i possibili nodi Redis usando uno degli approcci seguenti:

  • Elencare i nodi nella stringa di connessione delimitati da virgole.
  • Se si usa un comportamento personalizzato per gli errori di connessione, aggiungere i nodi a ConfigurationOptions.Endpoints.

Passaggi successivi

Per ulteriori informazioni, vedi le seguenti risorse:

Questo articolo illustra SignalRaspetti specifici della configurazione di un server Redis da usare per aumentare il numero di istanze di un'app ASP.NET Core SignalR .

Avviso

Questo articolo illustra l'uso di stringa di connessione. Con un database locale l'utente non deve essere autenticato, ma nell'ambiente di produzione stringa di connessione talvolta include una password per l'autenticazione. Una credenziale della password del proprietario della risorsa (ROPC) è un rischio per la sicurezza che deve essere evitato nei database di produzione. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app distribuite in ambienti di test o di produzione, vedere Proteggere i flussi di autenticazione.

Configurare un backplane Redis

  • Distribuire un server Redis.

    Importante

    Per l'uso in produzione, è consigliabile usare un backplane Redis solo quando viene eseguito nello stesso data center dell'app SignalR . In caso contrario, la latenza di rete degrada le prestazioni. SignalR Se l'app è in esecuzione nel cloud di Azure, è consigliabile usare il servizio di Azure SignalR anziché un backplane Redis.

    Per ulteriori informazioni, vedi le seguenti risorse:

  • Nell'app SignalR installare il pacchetto NuGet seguente:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Startup.ConfigureServices Nel metodo chiamare AddStackExchangeRedis:

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

    La maggior parte delle opzioni può essere impostata nel stringa di connessione o nell'oggetto ConfigurationOptions . Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell'oggetto ConfigurationOptions . In questo esempio viene aggiunto un prefisso del canale in modo che più app possano condividere la stessa istanza di Redis, come illustrato nel passaggio seguente.

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

    Nel codice precedente, options.Configuration viene inizializzato con qualsiasi elemento specificato nella stringa di connessione.

    Per informazioni sulle opzioni di Redis, vedere la documentazione di StackExchange Redis.

  • Se si usa un server Redis per più SignalR app, usare un prefisso di canale diverso per ogni SignalR app.

    L'impostazione di un prefisso del canale isola un'app SignalR da altre che usano prefissi di canale diversi. Se non si assegnano prefissi diversi, un messaggio inviato da un'app a tutti i propri client passerà a tutti i client di tutte le app che usano il server Redis come backplane.

  • Configurare il software di bilanciamento del carico della server farm per sessioni permanenti. Ecco alcuni esempi di documentazione su come eseguire questa operazione:

Errori del server Redis

Quando un server Redis diventa inattivo, SignalR genera eccezioni che indicano che i messaggi non verranno recapitati. Alcuni messaggi di eccezione tipici:

  • Messaggio di scrittura non riuscito
  • Impossibile richiamare il metodo hub 'MethodName'
  • Connessione a Redis non riuscita

SignalR non memorizza nel buffer i messaggi da inviare quando viene eseguito il backup del server. Tutti i messaggi inviati mentre il server Redis è inattivo vengono persi.

SignalR si riconnette automaticamente quando il server Redis è nuovamente disponibile.

Comportamento personalizzato per gli errori di connessione

Ecco un esempio che illustra come gestire gli eventi di errore di connessione 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 Redis

Il cluster Redis usa più server Redis attivi contemporaneamente per ottenere disponibilità elevata. Quando il cluster Redis viene usato come backplane per SignalR, i messaggi vengono recapitati a tutti i nodi del cluster senza apportare modifiche al codice all'app.

Esiste un compromesso tra il numero di nodi nel cluster e la velocità effettiva del backplane. L'aumento del numero di nodi aumenta la disponibilità del cluster, ma riduce la velocità effettiva perché i messaggi devono essere trasmessi a tutti i nodi del cluster.

Nell'app SignalR includere tutti i possibili nodi Redis usando uno degli approcci seguenti:

  • Elencare i nodi nella stringa di connessione delimitati da virgole.
  • Se si usa un comportamento personalizzato per gli errori di connessione, aggiungere i nodi a ConfigurationOptions.Endpoints.

Passaggi successivi

Per ulteriori informazioni, vedi le seguenti risorse:

Questo articolo illustra SignalRaspetti specifici della configurazione di un server Redis da usare per aumentare il numero di istanze di un'app ASP.NET Core SignalR .

Avviso

Questo articolo illustra l'uso di stringa di connessione. Con un database locale l'utente non deve essere autenticato, ma nell'ambiente di produzione stringa di connessione talvolta include una password per l'autenticazione. Una credenziale della password del proprietario della risorsa (ROPC) è un rischio per la sicurezza che deve essere evitato nei database di produzione. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app distribuite in ambienti di test o di produzione, vedere Proteggere i flussi di autenticazione.

Configurare un backplane Redis

  • Distribuire un server Redis.

    Importante

    Per l'uso in produzione, è consigliabile usare un backplane Redis solo quando viene eseguito nello stesso data center dell'app SignalR . In caso contrario, la latenza di rete degrada le prestazioni. SignalR Se l'app è in esecuzione nel cloud di Azure, è consigliabile usare il servizio di Azure SignalR anziché un backplane Redis.

    Per ulteriori informazioni, vedi le seguenti risorse:

  • Nell'app SignalR installare il pacchetto NuGet seguente:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Startup.ConfigureServices Nel metodo chiamare AddStackExchangeRedis:

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

    La maggior parte delle opzioni può essere impostata nel stringa di connessione o nell'oggetto ConfigurationOptions . Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell'oggetto ConfigurationOptions . In questo esempio viene aggiunto un prefisso del canale in modo che più app possano condividere la stessa istanza di Redis, come illustrato nel passaggio seguente.

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

    Nel codice precedente, options.Configuration viene inizializzato con qualsiasi elemento specificato nella stringa di connessione.

    Per informazioni sulle opzioni di Redis, vedere la documentazione di StackExchange Redis.

  • Se si usa un server Redis per più SignalR app, usare un prefisso di canale diverso per ogni SignalR app.

    L'impostazione di un prefisso del canale isola un'app SignalR da altre che usano prefissi di canale diversi. Se non si assegnano prefissi diversi, un messaggio inviato da un'app a tutti i propri client passerà a tutti i client di tutte le app che usano il server Redis come backplane.

  • Configurare il software di bilanciamento del carico della server farm per sessioni permanenti. Ecco alcuni esempi di documentazione su come eseguire questa operazione:

Errori del server Redis

Quando un server Redis diventa inattivo, SignalR genera eccezioni che indicano che i messaggi non verranno recapitati. Alcuni messaggi di eccezione tipici:

  • Messaggio di scrittura non riuscito
  • Impossibile richiamare il metodo hub 'MethodName'
  • Connessione a Redis non riuscita

SignalR non memorizza nel buffer i messaggi da inviare quando viene eseguito il backup del server. Tutti i messaggi inviati mentre il server Redis è inattivo vengono persi.

SignalR si riconnette automaticamente quando il server Redis è nuovamente disponibile.

Comportamento personalizzato per gli errori di connessione

Ecco un esempio che illustra come gestire gli eventi di errore di connessione 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 Redis

Il cluster Redis usa più server Redis attivi contemporaneamente per ottenere disponibilità elevata. Quando il cluster Redis viene usato come backplane per SignalR, i messaggi vengono recapitati a tutti i nodi del cluster senza apportare modifiche al codice all'app.

Esiste un compromesso tra il numero di nodi nel cluster e la velocità effettiva del backplane. L'aumento del numero di nodi aumenta la disponibilità del cluster, ma riduce la velocità effettiva perché i messaggi devono essere trasmessi a tutti i nodi del cluster.

Nell'app SignalR includere tutti i possibili nodi Redis usando uno degli approcci seguenti:

  • Elencare i nodi nella stringa di connessione delimitati da virgole.
  • Se si usa un comportamento personalizzato per gli errori di connessione, aggiungere i nodi a ConfigurationOptions.Endpoints.

Passaggi successivi

Per ulteriori informazioni, vedi le seguenti risorse:

Questo articolo illustra SignalRaspetti specifici della configurazione di un server Redis da usare per aumentare il numero di istanze di un'app ASP.NET Core SignalR .

Avviso

Questo articolo illustra l'uso di stringa di connessione. Con un database locale l'utente non deve essere autenticato, ma nell'ambiente di produzione stringa di connessione talvolta include una password per l'autenticazione. Una credenziale della password del proprietario della risorsa (ROPC) è un rischio per la sicurezza che deve essere evitato nei database di produzione. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app distribuite in ambienti di test o di produzione, vedere Proteggere i flussi di autenticazione.

Configurare un backplane Redis

  • Distribuire un server Redis.

    Importante

    Per l'uso in produzione, è consigliabile usare un backplane Redis solo quando viene eseguito nello stesso data center dell'app SignalR . In caso contrario, la latenza di rete degrada le prestazioni. SignalR Se l'app è in esecuzione nel cloud di Azure, è consigliabile usare il servizio di Azure SignalR anziché un backplane Redis.

    Per ulteriori informazioni, vedi le seguenti risorse:

  • Nell'app SignalR installare uno dei pacchetti NuGet seguenti:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis - Dipende da StackExchange.Redis 2.X.X. Questo è il pacchetto consigliato per ASP.NET Core 2.2 e versioni successive.
    • Microsoft.AspNetCore.SignalR.Redis - Dipende da StackExchange.Redis 1.X.X. Questo pacchetto non è incluso in ASP.NET Core 3.0 e versioni successive.
  • Startup.ConfigureServices Nel metodo chiamare AddStackExchangeRedis:

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

Quando si usa Microsoft.AspNetCore.SignalR.Redis, chiamare AddRedis.

  • Configurare le opzioni in base alle esigenze:

    La maggior parte delle opzioni può essere impostata nel stringa di connessione o nell'oggetto ConfigurationOptions. Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell'oggetto ConfigurationOptions . In questo esempio viene aggiunto un prefisso del canale in modo che più app possano condividere la stessa istanza di Redis, come illustrato nel passaggio seguente.

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

Quando si usa Microsoft.AspNetCore.SignalR.Redis, chiamare AddRedis.

Nel codice precedente, options.Configuration viene inizializzato con qualsiasi elemento specificato nella stringa di connessione.

Per informazioni sulle opzioni di Redis, vedere la documentazione di StackExchange Redis.

  • Se si usa un server Redis per più SignalR app, usare un prefisso di canale diverso per ogni SignalR app.

    L'impostazione di un prefisso del canale isola un'app SignalR da altre che usano prefissi di canale diversi. Se non si assegnano prefissi diversi, un messaggio inviato da un'app a tutti i propri client passerà a tutti i client di tutte le app che usano il server Redis come backplane.

  • Configurare il software di bilanciamento del carico della server farm per sessioni permanenti. Ecco alcuni esempi di documentazione su come eseguire questa operazione:

Errori del server Redis

Quando un server Redis diventa inattivo, SignalR genera eccezioni che indicano che i messaggi non verranno recapitati. Alcuni messaggi di eccezione tipici:

  • Messaggio di scrittura non riuscito
  • Impossibile richiamare il metodo hub 'MethodName'
  • Connessione a Redis non riuscita

SignalR non memorizza nel buffer i messaggi da inviare quando viene eseguito il backup del server. Tutti i messaggi inviati mentre il server Redis è inattivo vengono persi.

SignalR si riconnette automaticamente quando il server Redis è nuovamente disponibile.

Comportamento personalizzato per gli errori di connessione

Ecco un esempio che illustra come gestire gli eventi di errore di connessione 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 Redis

Il cluster Redis usa più server Redis attivi contemporaneamente per ottenere disponibilità elevata. Quando il cluster Redis viene usato come backplane per SignalR, i messaggi vengono recapitati a tutti i nodi del cluster senza apportare modifiche al codice all'app.

Esiste un compromesso tra il numero di nodi nel cluster e la velocità effettiva del backplane. L'aumento del numero di nodi aumenta la disponibilità del cluster, ma riduce la velocità effettiva perché i messaggi devono essere trasmessi a tutti i nodi del cluster.

Nell'app SignalR includere tutti i possibili nodi Redis usando uno degli approcci seguenti:

  • Elencare i nodi nella stringa di connessione delimitati da virgole.
  • Se si usa un comportamento personalizzato per gli errori di connessione, aggiungere i nodi a ConfigurationOptions.Endpoints.

Passaggi successivi

Per ulteriori informazioni, vedi le seguenti risorse:

Questo articolo illustra SignalRaspetti specifici della configurazione di un server Redis da usare per aumentare il numero di istanze di un'app ASP.NET Core SignalR .

Avviso

Questo articolo illustra l'uso di stringa di connessione. Con un database locale l'utente non deve essere autenticato, ma nell'ambiente di produzione stringa di connessione talvolta include una password per l'autenticazione. Una credenziale della password del proprietario della risorsa (ROPC) è un rischio per la sicurezza che deve essere evitato nei database di produzione. Le app di produzione devono usare il flusso di autenticazione più sicuro disponibile. Per altre informazioni sull'autenticazione per le app distribuite in ambienti di test o di produzione, vedere Proteggere i flussi di autenticazione.

Configurare un backplane Redis

  • Distribuire un server Redis.

    Importante

    Per l'uso in produzione, è consigliabile usare un backplane Redis solo quando viene eseguito nello stesso data center dell'app SignalR . In caso contrario, la latenza di rete degrada le prestazioni. SignalR Se l'app è in esecuzione nel cloud di Azure, è consigliabile usare il servizio di Azure SignalR anziché un backplane Redis.

    Per ulteriori informazioni, vedi le seguenti risorse:

  • Nell'app SignalR installare il Microsoft.AspNetCore.SignalR.Redis pacchetto NuGet.

  • Startup.ConfigureServices Nel metodo chiamare AddRedis dopo AddSignalR:

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

    La maggior parte delle opzioni può essere impostata nel stringa di connessione o nell'oggetto ConfigurationOptions. Le opzioni specificate in ConfigurationOptions eseguono l'override di quelle impostate nella stringa di connessione.

    Nell'esempio seguente viene illustrato come impostare le opzioni nell'oggetto ConfigurationOptions . In questo esempio viene aggiunto un prefisso del canale in modo che più app possano condividere la stessa istanza di Redis, come illustrato nel passaggio seguente.

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

    Nel codice precedente, options.Configuration viene inizializzato con qualsiasi elemento specificato nella stringa di connessione.

  • Se si usa un server Redis per più SignalR app, usare un prefisso di canale diverso per ogni SignalR app.

    L'impostazione di un prefisso del canale isola un'app SignalR da altre che usano prefissi di canale diversi. Se non si assegnano prefissi diversi, un messaggio inviato da un'app a tutti i propri client passerà a tutti i client di tutte le app che usano il server Redis come backplane.

  • Configurare il software di bilanciamento del carico della server farm per sessioni permanenti. Ecco alcuni esempi di documentazione su come eseguire questa operazione:

Errori del server Redis

Quando un server Redis diventa inattivo, SignalR genera eccezioni che indicano che i messaggi non verranno recapitati. Alcuni messaggi di eccezione tipici:

  • Messaggio di scrittura non riuscito
  • Impossibile richiamare il metodo hub 'MethodName'
  • Connessione a Redis non riuscita

SignalR non memorizza nel buffer i messaggi da inviare quando viene eseguito il backup del server. Tutti i messaggi inviati mentre il server Redis è inattivo vengono persi.

SignalR si riconnette automaticamente quando il server Redis è nuovamente disponibile.

Comportamento personalizzato per gli errori di connessione

Ecco un esempio che illustra come gestire gli eventi di errore di connessione 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 Redis

Il cluster Redis usa più server Redis attivi contemporaneamente per ottenere disponibilità elevata. Quando il cluster Redis viene usato come backplane per SignalR, i messaggi vengono recapitati a tutti i nodi del cluster senza apportare modifiche al codice all'app.

Esiste un compromesso tra il numero di nodi nel cluster e la velocità effettiva del backplane. L'aumento del numero di nodi aumenta la disponibilità del cluster, ma riduce la velocità effettiva perché i messaggi devono essere trasmessi a tutti i nodi del cluster.

Nell'app SignalR includere tutti i possibili nodi Redis usando uno degli approcci seguenti:

  • Elencare i nodi nella stringa di connessione delimitati da virgole.
  • Se si usa un comportamento personalizzato per gli errori di connessione, aggiungere i nodi a ConfigurationOptions.Endpoints.

Passaggi successivi

Per ulteriori informazioni, vedi le seguenti risorse: