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

Von Andrew Stanton-Nurse, Brady Gaster und Tom Dykstra,

In diesem Artikel werden bestimmte Aspekte des Einrichtens eines Redis-Servers erläutertSignalR, der zum Skalieren einer ASP.NET Core-App SignalR verwendet werden soll.

Einrichten eines Redis-Backplanes

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

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

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

    Die meisten Optionen können in der Verbindungszeichenfolge oder im ConfigurationOptions-Objekt festgelegt werden. In der Verbindungszeichenfolge festgelegte ConfigurationOptions Optionen außer Kraft setzen.

    Im folgenden Beispiel wird gezeigt, wie Optionen im ConfigurationOptions Objekt festgelegt werden. In diesem Beispiel wird ein Kanalpräfix hinzugefügt, damit mehrere Apps dieselbe Redis-Instanz freigeben können, wie im folgenden Schritt erläutert.

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

    Im vorherigen Code options.Configuration wird mit dem in der Verbindungszeichenfolge angegebenen Wert initialisiert.

  • 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 folgendes auf AddStackExchangeRedis:

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

Rufen Sie bei Verwendung Microsoft.AspNetCore.SignalR.Redisvon , anruft AddRedis.

  • Konfigurieren Sie nach Bedarf Optionen:

    Die meisten Optionen können in der Verbindungszeichenfolge oder im ConfigurationOptions-Objekt festgelegt werden. In der Verbindungszeichenfolge festgelegte ConfigurationOptions Optionen außer Kraft setzen.

    Im folgenden Beispiel wird gezeigt, wie Optionen im ConfigurationOptions Objekt festgelegt werden. In diesem Beispiel wird ein Kanalpräfix hinzugefügt, damit mehrere Apps dieselbe Redis-Instanz freigeben können, wie im folgenden Schritt erläutert.

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

Rufen Sie bei Verwendung Microsoft.AspNetCore.SignalR.Redisvon , anruft AddRedis.

Im vorherigen Code options.Configuration wird mit dem in der Verbindungszeichenfolge angegebenen Wert initialisiert.

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 folgendes auf AddStackExchangeRedis:

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

    Die meisten Optionen können in der Verbindungszeichenfolge oder im ConfigurationOptions-Objekt festgelegt werden. In der Verbindungszeichenfolge festgelegte ConfigurationOptions Optionen außer Kraft setzen.

    Im folgenden Beispiel wird gezeigt, wie Optionen im ConfigurationOptions Objekt festgelegt werden. In diesem Beispiel wird ein Kanalpräfix hinzugefügt, damit mehrere Apps dieselbe Redis-Instanz freigeben können, wie im folgenden Schritt erläutert.

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

    Im vorherigen Code options.Configuration wird mit dem in der Verbindungszeichenfolge angegebenen Wert initialisiert.

    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 SignalR App ein anderes Kanalpräfix.

    Durch Festlegen eines Kanalpräfixes wird eine SignalR App von anderen 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, zu allen Clients aller Apps wechseln, die den Redis-Server als Backplane verwenden.

  • Konfigurieren Sie Die Serverfarm-Lastenausgleichssoftware für Sticky-Sitzungen. Hier sind einige Beispiele für Dokumentationen zur Vorgehensweise:

Redis-Serverfehler

Wenn ein Redis-Server abläuft, werden Ausnahmen ausgelöst, die darauf hinweisen, SignalR dass Nachrichten nicht übermittelt werden. Einige typische Ausnahmemeldungen:

  • Fehler beim Schreiben einer Nachricht
  • Fehler beim Aufrufen der Hubmethode 'MethodName'
  • Verbindung mit Redis fehlgeschlagen

SignalR Puffert die Nachrichten nicht, um sie zu senden, wenn der Server gesichert wird. Alle Nachrichten, die gesendet werden, während der Redis-Server nach unten ist, gehen verloren.

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

Benutzerdefiniertes Verhalten für Verbindungsfehler

Hier sehen Sie ein Beispiel, in dem gezeigt wird, 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 einer hohen Verfügbarkeit mithilfe mehrerer Redis-Server. Das Clustering wird nicht offiziell unterstützt, funktioniert aber möglicherweise.

Nächste Schritte

Weitere Informationen finden Sie in den folgenden Ressourcen: