Einrichten einer Redis-Backplane für ASP.NET Core SignalR aufskalieren

Von Andrew Prozentton-Nurse,Brady Gasterund Tom Dykstra,

In diesem Artikel werden SignalR -spezifische Aspekte der Einrichtung eines SignalR zum Horizontalskalierung einer SignalR ASP.NET Core-App erläutert.

Einrichten einer Redis-Backplane

  • Stellen Sie einen Redis-Server bereit.

    Wichtig

    Für die Verwendung in der Produktion wird eine Redis-Backplane nur empfohlen, wenn sie in demselben Rechenzentrum wie die App ausgeführt SignalR wird. Andernfalls beeinträchtigt die Netzwerklatenz die Leistung. Wenn Ihre SignalR App in der Azure-Cloud ausgeführt wird, wird SignalR anstelle einer Redis-Backplane der Azure-Dienst empfohlen.

    Weitere Informationen finden Sie in den folgenden Ressourcen:

  • Installieren Sie in der SignalR App das Microsoft.AspNetCore.SignalR.Redis NuGet Paket.

  • Rufen Sie in der Startup.ConfigureServices -Methode AddRedis nach AddSignalR auf:

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • Konfigurieren Sie die Optionen nach Bedarf:

    Die meisten Optionen können in der Verbindungszeichenfolge oder im ConfigurationOptions-Objekt festgelegt werden. Die in angegebenen Optionen ConfigurationOptions überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt, wie Optionen im -Objekt festgelegt ConfigurationOptions werden. In diesem Beispiel wird ein Kanalpräfix hinzugefügt, sodass mehrere Apps dieselbe Redis-Instanz gemeinsam nutzen können, wie im folgenden Schritt erläutert.

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

    Im vorangehenden Code options.Configuration wird mit dem initialisiert, was in der Verbindungszeichenfolge angegeben wurde.

  • Installieren Sie in der SignalR App eines der folgenden NuGet Pakete:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis– Hängt von StackExchange.Redis 2.X.X ab. Dies ist das empfohlene Paket für ASP.NET Core 2.2 und höher.
    • Microsoft.AspNetCore.SignalR.Redis– Hängt von StackExchange.Redis 1.X.X ab. Dieses Paket ist nicht in ASP.NET Core 3.0 und höher enthalten.
  • Rufen Sie in der Startup.ConfigureServices -Methode AddStackExchangeRedis auf:

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

Rufen Sie bei Verwendung von Microsoft.AspNetCore.SignalR.RedisAddRedis auf.

  • Konfigurieren Sie die Optionen nach Bedarf:

    Die meisten Optionen können in der Verbindungszeichenfolge oder im ConfigurationOptions-Objekt festgelegt werden. Die in angegebenen Optionen ConfigurationOptions überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt, wie Optionen im -Objekt festgelegt ConfigurationOptions werden. In diesem Beispiel wird ein Kanalpräfix hinzugefügt, sodass mehrere Apps dieselbe Redis-Instanz gemeinsam nutzen können, wie im folgenden Schritt erläutert.

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

Rufen Sie bei Verwendung von Microsoft.AspNetCore.SignalR.RedisAddRedis auf.

Im vorangehenden Code options.Configuration wird mit dem initialisiert, was in der Verbindungszeichenfolge angegeben wurde.

Informationen zu Redis-Optionen finden Sie in der StackExchange Redis-Dokumentation.

  • Installieren Sie in der SignalR App das folgende NuGet Paket:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Rufen Sie in der Startup.ConfigureServices -Methode AddStackExchangeRedis auf:

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • Konfigurieren Sie die Optionen nach Bedarf:

    Die meisten Optionen können in der Verbindungszeichenfolge oder im ConfigurationOptions-Objekt festgelegt werden. Die in angegebenen Optionen ConfigurationOptions überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt, wie Optionen im -Objekt festgelegt ConfigurationOptions werden. In diesem Beispiel wird ein Kanalpräfix hinzugefügt, sodass mehrere Apps dieselbe Redis-Instanz gemeinsam nutzen können, wie im folgenden Schritt erläutert.

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

    Im vorangehenden Code options.Configuration wird mit dem initialisiert, was in der Verbindungszeichenfolge angegeben wurde.

    Informationen zu Redis-Optionen finden Sie in der StackExchange Redis-Dokumentation.

  • Wenn Sie einen Redis-Server für mehrere SignalR Apps verwenden, verwenden Sie für jede App ein anderes Kanalpräfix. SignalR

    Durch das Festlegen eines Kanalpräfixes wird eine App von anderen Apps SignalR isoliert, die unterschiedliche Kanalpräfixe verwenden. Wenn Sie keine anderen Präfixe zuweisen, wird eine Nachricht, die von einer App an alle eigenen Clients gesendet wird, an alle Clients aller Apps gesendet, die den Redis-Server als Backplane verwenden.

  • Konfigurieren Sie ihre Serverfarm-Lastenausgleichssoftware für sitzungsbelastete Sitzungen. Im Folgenden finden Sie einige Beispiele für die Dokumentation dazu:

Redis-Serverfehler

Wenn ein Redis-Server ausfällt, SignalR löst Ausnahmen aus, die darauf hinweisen, dass Nachrichten nicht zugestellt werden. Einige typische Ausnahmemeldungen:

  • Fehler beim Schreiben einer Nachricht
  • Fehler beim Aufrufen der Hubmethode "MethodName"
  • Fehler bei der Verbindung mit Redis

SignalR puffert keine Nachrichten, um sie zu senden, wenn der Server wieder hochkommt. Alle Nachrichten, die während des Ausfalls des Redis-Servers gesendet werden, gehen verloren.

SignalR stellt automatisch wieder eine Verbindung her, wenn der Redis-Server wieder verfügbar ist.

Benutzerdefiniertes Verhalten bei Verbindungsfehlern

Hier sehen Sie ein Beispiel, das zeigt, wie Redis-Verbindungsfehlerereignisse behandelt werden.

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

Redis-Clustering

Redis Clustering ist eine Methode zum Erreichen von Hochverfügbarkeit mit mehreren Redis-Servern. Clustering wird offiziell nicht unterstützt, kann aber funktionieren.

Nächste Schritte

Weitere Informationen finden Sie in den folgenden Ressourcen: