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

Von Andrew Stanton-Nurse, Brady Gaster und Tom Dykstra

In diesem Artikel werden die SignalR-spezifischen Aspekte des Einrichtens eines Redis-Servers erläutert, der zum Aufskalieren einer ASP.NET Core SignalR-App verwendet werden kann.

Einrichten einer Redis-Backplane

  • Stellen Sie einen Redis-Server bereit.

    Wichtig

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

    Weitere Informationen finden Sie in den folgenden Ressourcen:

  • Installieren Sie in der SignalR-App die folgenden NuGet-Pakete:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Rufen Sie AddStackExchangeRedis auf, indem Sie in der Datei Program.cs die folgende Zeile vor der Zeile einfügen, die builder.Build()) aufruft.

    builder.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 ConfigurationOptions angegebenen Optionen überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt das Festlegen von Optionen im ConfigurationOptions-Objekt. 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.

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

    Im Code oben wird options.Configuration mit dem in der Zeichenfolge 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.

    Das Festlegen eines Kanalpräfixes isoliert eine SignalR-App von anderen Apps, die andere 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 weitergeleitet, die den Redis-Server als Backplane verwenden.

  • Konfigurieren Sie ihre Serverfarm-Lastenausgleichssoftware für fixierte Sitzungen. Hier finden Sie einige Beispiele für Dokumentation zur Vorgehensweise:

Redis-Serverfehler

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

  • Fehler beim Schreiben von Nachrichten
  • Fehler beim Aufrufen der Hubmethode „MethodName“
  • Fehler bei der Verbindung mit Redis

SignalR puffert keine Nachrichten, um sie zu senden, wenn der Server wieder aktiv ist. Alle Nachrichten, die gesendet werden, während der Redis-Server ausgefallen ist, gehen verloren.

SignalR stellt automatisch erneut 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()
        .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-Cluster

Ein Redis-Cluster nutzt mehrere gleichzeitig aktive Redis-Server, um Hochverfügbarkeit zu erzielen. Wenn ein Redis-Cluster als Backplane für SignalR verwendet wird, werden Nachrichten ohne Codeänderungen an der App an alle Knoten des Clusters übermittelt.

Es gibt einen Kompromiss zwischen der Anzahl der Knoten im Cluster und dem Durchsatz der Backplane. Das Erhöhen der Anzahl von Knoten erhöht die Verfügbarkeit des Clusters, verringert jedoch den Durchsatz, weil Nachrichten an alle Knoten im Cluster übertragen werden müssen.

Binden Sie in der SignalR-App alle möglichen Redis-Knoten mit einem der folgenden Ansätze ein:

  • Listen Sie die Knoten in der Verbindungszeichenfolge auf (durch Kommas getrennt).
  • Wenn Sie benutzerdefiniertes Verhalten bei Verbindungsfehlern verwenden, fügen Sie die Knoten ConfigurationOptions.Endpoints hinzu.

Nächste Schritte

Weitere Informationen finden Sie in den folgenden Ressourcen:

In diesem Artikel werden die SignalR-spezifischen Aspekte des Einrichtens eines Redis-Servers erläutert, der zum Aufskalieren einer ASP.NET Core SignalR-App verwendet werden kann.

Einrichten einer Redis-Backplane

  • Stellen Sie einen Redis-Server bereit.

    Wichtig

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

    Weitere Informationen finden Sie in den folgenden Ressourcen:

  • Installieren Sie in der SignalR-App die folgenden NuGet-Pakete:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Rufen Sie AddStackExchangeRedis auf, indem Sie in der Datei Program.cs die folgende Zeile vor der Zeile einfügen, die builder.Build()) aufruft.

    builder.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 ConfigurationOptions angegebenen Optionen überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt das Festlegen von Optionen im ConfigurationOptions-Objekt. 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 Code oben wird options.Configuration mit dem in der Zeichenfolge 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.

    Das Festlegen eines Kanalpräfixes isoliert eine SignalR-App von anderen Apps, die andere 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 weitergeleitet, die den Redis-Server als Backplane verwenden.

  • Konfigurieren Sie ihre Serverfarm-Lastenausgleichssoftware für fixierte Sitzungen. Hier finden Sie einige Beispiele für Dokumentation zur Vorgehensweise:

Redis-Serverfehler

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

  • Fehler beim Schreiben von Nachrichten
  • Fehler beim Aufrufen der Hubmethode „MethodName“
  • Fehler bei der Verbindung mit Redis

SignalR puffert keine Nachrichten, um sie zu senden, wenn der Server wieder aktiv ist. Alle Nachrichten, die gesendet werden, während der Redis-Server ausgefallen ist, gehen verloren.

SignalR stellt automatisch erneut 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()
        .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-Cluster

Ein Redis-Cluster nutzt mehrere gleichzeitig aktive Redis-Server, um Hochverfügbarkeit zu erzielen. Wenn ein Redis-Cluster als Backplane für SignalR verwendet wird, werden Nachrichten ohne Codeänderungen an der App an alle Knoten des Clusters übermittelt.

Es gibt einen Kompromiss zwischen der Anzahl der Knoten im Cluster und dem Durchsatz der Backplane. Das Erhöhen der Anzahl von Knoten erhöht die Verfügbarkeit des Clusters, verringert jedoch den Durchsatz, weil Nachrichten an alle Knoten im Cluster übertragen werden müssen.

Binden Sie in der SignalR-App alle möglichen Redis-Knoten mit einem der folgenden Ansätze ein:

  • Listen Sie die Knoten in der Verbindungszeichenfolge auf (durch Kommas getrennt).
  • Wenn Sie benutzerdefiniertes Verhalten bei Verbindungsfehlern verwenden, fügen Sie die Knoten ConfigurationOptions.Endpoints hinzu.

Nächste Schritte

Weitere Informationen finden Sie in den folgenden Ressourcen:

In diesem Artikel werden die SignalR-spezifischen Aspekte des Einrichtens eines Redis-Servers erläutert, der zum Aufskalieren einer ASP.NET Core SignalR-App verwendet werden kann.

Einrichten einer Redis-Backplane

  • Stellen Sie einen Redis-Server bereit.

    Wichtig

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

    Weitere Informationen finden Sie in den folgenden Ressourcen:

  • Installieren Sie in der SignalR-App die folgenden NuGet-Pakete:

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Rufen Sie AddStackExchangeRedis auf, indem Sie in der Datei Program.cs die folgende Zeile vor der Zeile einfügen, die builder.Build()) aufruft.

    builder.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 ConfigurationOptions angegebenen Optionen überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt das Festlegen von Optionen im ConfigurationOptions-Objekt. 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.

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

    Im Code oben wird options.Configuration mit dem in der Zeichenfolge 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.

    Das Festlegen eines Kanalpräfixes isoliert eine SignalR-App von anderen Apps, die andere 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 weitergeleitet, die den Redis-Server als Backplane verwenden.

  • Konfigurieren Sie ihre Serverfarm-Lastenausgleichssoftware für fixierte Sitzungen. Hier finden Sie einige Beispiele für Dokumentation zur Vorgehensweise:

Redis-Serverfehler

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

  • Fehler beim Schreiben von Nachrichten
  • Fehler beim Aufrufen der Hubmethode „MethodName“
  • Fehler bei der Verbindung mit Redis

SignalR puffert keine Nachrichten, um sie zu senden, wenn der Server wieder aktiv ist. Alle Nachrichten, die gesendet werden, während der Redis-Server ausgefallen ist, gehen verloren.

SignalR stellt automatisch erneut 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()
        .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-Cluster

Ein Redis-Cluster nutzt mehrere gleichzeitig aktive Redis-Server, um Hochverfügbarkeit zu erzielen. Wenn ein Redis-Cluster als Backplane für SignalR verwendet wird, werden Nachrichten ohne Codeänderungen an der App an alle Knoten des Clusters übermittelt.

Es gibt einen Kompromiss zwischen der Anzahl der Knoten im Cluster und dem Durchsatz der Backplane. Das Erhöhen der Anzahl von Knoten erhöht die Verfügbarkeit des Clusters, verringert jedoch den Durchsatz, weil Nachrichten an alle Knoten im Cluster übertragen werden müssen.

Binden Sie in der SignalR-App alle möglichen Redis-Knoten mit einem der folgenden Ansätze ein:

  • Listen Sie die Knoten in der Verbindungszeichenfolge auf (durch Kommas getrennt).
  • Wenn Sie benutzerdefiniertes Verhalten bei Verbindungsfehlern verwenden, fügen Sie die Knoten ConfigurationOptions.Endpoints hinzu.

Nächste Schritte

Weitere Informationen finden Sie in den folgenden Ressourcen:

In diesem Artikel werden die SignalR-spezifischen Aspekte des Einrichtens eines Redis-Servers erläutert, der zum Aufskalieren einer ASP.NET Core SignalR-App verwendet werden kann.

Einrichten einer Redis-Backplane

  • Stellen Sie einen Redis-Server bereit.

    Wichtig

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

    Weitere Informationen finden Sie in den folgenden Ressourcen:

  • Installieren Sie in der SignalR-App die folgenden NuGet-Pakete:

    • 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 ConfigurationOptions angegebenen Optionen überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt das Festlegen von Optionen im ConfigurationOptions-Objekt. 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 Code oben wird options.Configuration mit dem in der Zeichenfolge 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.

    Das Festlegen eines Kanalpräfixes isoliert eine SignalR-App von anderen Apps, die andere 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 weitergeleitet, die den Redis-Server als Backplane verwenden.

  • Konfigurieren Sie ihre Serverfarm-Lastenausgleichssoftware für fixierte Sitzungen. Hier finden Sie einige Beispiele für Dokumentation zur Vorgehensweise:

Redis-Serverfehler

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

  • Fehler beim Schreiben von Nachrichten
  • Fehler beim Aufrufen der Hubmethode „MethodName“
  • Fehler bei der Verbindung mit Redis

SignalR puffert keine Nachrichten, um sie zu senden, wenn der Server wieder aktiv ist. Alle Nachrichten, die gesendet werden, während der Redis-Server ausgefallen ist, gehen verloren.

SignalR stellt automatisch erneut 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()
        .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-Cluster

Ein Redis-Cluster nutzt mehrere gleichzeitig aktive Redis-Server, um Hochverfügbarkeit zu erzielen. Wenn ein Redis-Cluster als Backplane für SignalR verwendet wird, werden Nachrichten ohne Codeänderungen an der App an alle Knoten des Clusters übermittelt.

Es gibt einen Kompromiss zwischen der Anzahl der Knoten im Cluster und dem Durchsatz der Backplane. Das Erhöhen der Anzahl von Knoten erhöht die Verfügbarkeit des Clusters, verringert jedoch den Durchsatz, weil Nachrichten an alle Knoten im Cluster übertragen werden müssen.

Binden Sie in der SignalR-App alle möglichen Redis-Knoten mit einem der folgenden Ansätze ein:

  • Listen Sie die Knoten in der Verbindungszeichenfolge auf (durch Kommas getrennt).
  • Wenn Sie benutzerdefiniertes Verhalten bei Verbindungsfehlern verwenden, fügen Sie die Knoten ConfigurationOptions.Endpoints hinzu.

Nächste Schritte

Weitere Informationen finden Sie in den folgenden Ressourcen:

In diesem Artikel werden die SignalR-spezifischen Aspekte des Einrichtens eines Redis-Servers erläutert, der zum Aufskalieren einer ASP.NET Core SignalR-App verwendet werden kann.

Einrichten einer Redis-Backplane

  • Stellen Sie einen Redis-Server bereit.

    Wichtig

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

    Weitere Informationen finden Sie in den folgenden Ressourcen:

  • Installieren Sie in der SignalR-App die folgenden NuGet-Pakete:

    • 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 ConfigurationOptions angegebenen Optionen überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt das Festlegen von Optionen im ConfigurationOptions-Objekt. 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 Code oben wird options.Configuration mit dem in der Zeichenfolge 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.

    Das Festlegen eines Kanalpräfixes isoliert eine SignalR-App von anderen Apps, die andere 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 weitergeleitet, die den Redis-Server als Backplane verwenden.

  • Konfigurieren Sie ihre Serverfarm-Lastenausgleichssoftware für fixierte Sitzungen. Hier finden Sie einige Beispiele für Dokumentation zur Vorgehensweise:

Redis-Serverfehler

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

  • Fehler beim Schreiben von Nachrichten
  • Fehler beim Aufrufen der Hubmethode „MethodName“
  • Fehler bei der Verbindung mit Redis

SignalR puffert keine Nachrichten, um sie zu senden, wenn der Server wieder aktiv ist. Alle Nachrichten, die gesendet werden, während der Redis-Server ausgefallen ist, gehen verloren.

SignalR stellt automatisch erneut 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()
        .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-Cluster

Ein Redis-Cluster nutzt mehrere gleichzeitig aktive Redis-Server, um Hochverfügbarkeit zu erzielen. Wenn ein Redis-Cluster als Backplane für SignalR verwendet wird, werden Nachrichten ohne Codeänderungen an der App an alle Knoten des Clusters übermittelt.

Es gibt einen Kompromiss zwischen der Anzahl der Knoten im Cluster und dem Durchsatz der Backplane. Das Erhöhen der Anzahl von Knoten erhöht die Verfügbarkeit des Clusters, verringert jedoch den Durchsatz, weil Nachrichten an alle Knoten im Cluster übertragen werden müssen.

Binden Sie in der SignalR-App alle möglichen Redis-Knoten mit einem der folgenden Ansätze ein:

  • Listen Sie die Knoten in der Verbindungszeichenfolge auf (durch Kommas getrennt).
  • Wenn Sie benutzerdefiniertes Verhalten bei Verbindungsfehlern verwenden, fügen Sie die Knoten ConfigurationOptions.Endpoints hinzu.

Nächste Schritte

Weitere Informationen finden Sie in den folgenden Ressourcen:

In diesem Artikel werden die SignalR-spezifischen Aspekte des Einrichtens eines Redis-Servers erläutert, der zum Aufskalieren einer ASP.NET Core SignalR-App verwendet werden kann.

Einrichten einer Redis-Backplane

  • Stellen Sie einen Redis-Server bereit.

    Wichtig

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

    Weitere Informationen finden Sie in den folgenden Ressourcen:

  • 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 in ASP.NET Core 3.0 und höher nicht 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 ConfigurationOptions angegebenen Optionen überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt das Festlegen von Optionen im ConfigurationOptions-Objekt. 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 Code oben wird options.Configuration mit dem in der Zeichenfolge 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.

    Das Festlegen eines Kanalpräfixes isoliert eine SignalR-App von anderen Apps, die andere 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 weitergeleitet, die den Redis-Server als Backplane verwenden.

  • Konfigurieren Sie ihre Serverfarm-Lastenausgleichssoftware für fixierte Sitzungen. Hier finden Sie einige Beispiele für Dokumentation zur Vorgehensweise:

Redis-Serverfehler

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

  • Fehler beim Schreiben von Nachrichten
  • Fehler beim Aufrufen der Hubmethode „MethodName“
  • Fehler bei der Verbindung mit Redis

SignalR puffert keine Nachrichten, um sie zu senden, wenn der Server wieder aktiv ist. Alle Nachrichten, die gesendet werden, während der Redis-Server ausgefallen ist, gehen verloren.

SignalR stellt automatisch erneut 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()
        .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-Cluster

Ein Redis-Cluster nutzt mehrere gleichzeitig aktive Redis-Server, um Hochverfügbarkeit zu erzielen. Wenn ein Redis-Cluster als Backplane für SignalR verwendet wird, werden Nachrichten ohne Codeänderungen an der App an alle Knoten des Clusters übermittelt.

Es gibt einen Kompromiss zwischen der Anzahl der Knoten im Cluster und dem Durchsatz der Backplane. Das Erhöhen der Anzahl von Knoten erhöht die Verfügbarkeit des Clusters, verringert jedoch den Durchsatz, weil Nachrichten an alle Knoten im Cluster übertragen werden müssen.

Binden Sie in der SignalR-App alle möglichen Redis-Knoten mit einem der folgenden Ansätze ein:

  • Listen Sie die Knoten in der Verbindungszeichenfolge auf (durch Kommas getrennt).
  • Wenn Sie benutzerdefiniertes Verhalten bei Verbindungsfehlern verwenden, fügen Sie die Knoten ConfigurationOptions.Endpoints hinzu.

Nächste Schritte

Weitere Informationen finden Sie in den folgenden Ressourcen:

In diesem Artikel werden die SignalR-spezifischen Aspekte des Einrichtens eines Redis-Servers erläutert, der zum Aufskalieren einer ASP.NET Core SignalR-App verwendet werden kann.

Einrichten einer Redis-Backplane

  • Stellen Sie einen Redis-Server bereit.

    Wichtig

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

    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 ConfigurationOptions angegebenen Optionen überschreiben die in der Verbindungszeichenfolge festgelegten Optionen.

    Das folgende Beispiel zeigt das Festlegen von Optionen im ConfigurationOptions-Objekt. 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 Code oben wird options.Configuration mit dem in der Zeichenfolge angegebenen Wert initialisiert.

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

    Das Festlegen eines Kanalpräfixes isoliert eine SignalR-App von anderen Apps, die andere 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 weitergeleitet, die den Redis-Server als Backplane verwenden.

  • Konfigurieren Sie ihre Serverfarm-Lastenausgleichssoftware für fixierte Sitzungen. Hier finden Sie einige Beispiele für Dokumentation zur Vorgehensweise:

Redis-Serverfehler

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

  • Fehler beim Schreiben von Nachrichten
  • Fehler beim Aufrufen der Hubmethode „MethodName“
  • Fehler bei der Verbindung mit Redis

SignalR puffert keine Nachrichten, um sie zu senden, wenn der Server wieder aktiv ist. Alle Nachrichten, die gesendet werden, während der Redis-Server ausgefallen ist, gehen verloren.

SignalR stellt automatisch erneut 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;
            };
        });

Redis-Cluster

Ein Redis-Cluster nutzt mehrere gleichzeitig aktive Redis-Server, um Hochverfügbarkeit zu erzielen. Wenn ein Redis-Cluster als Backplane für SignalR verwendet wird, werden Nachrichten ohne Codeänderungen an der App an alle Knoten des Clusters übermittelt.

Es gibt einen Kompromiss zwischen der Anzahl der Knoten im Cluster und dem Durchsatz der Backplane. Das Erhöhen der Anzahl von Knoten erhöht die Verfügbarkeit des Clusters, verringert jedoch den Durchsatz, weil Nachrichten an alle Knoten im Cluster übertragen werden müssen.

Binden Sie in der SignalR-App alle möglichen Redis-Knoten mit einem der folgenden Ansätze ein:

  • Listen Sie die Knoten in der Verbindungszeichenfolge auf (durch Kommas getrennt).
  • Wenn Sie benutzerdefiniertes Verhalten bei Verbindungsfehlern verwenden, fügen Sie die Knoten ConfigurationOptions.Endpoints hinzu.

Nächste Schritte

Weitere Informationen finden Sie in den folgenden Ressourcen: