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.
Warnung
In diesem Artikel wird die Verwendung von Verbindungszeichenfolge gezeigt. Bei einer lokalen Datenbank muss der Benutzer nicht authentifiziert werden, aber in der Produktion enthalten Verbindungszeichenfolge manchmal ein Kennwort für die Authentifizierung. Ein Ressourcenbesitzer-Kennwortanmeldeinformation (ROPC) ist ein Sicherheitsrisiko, das in Produktionsdatenbanken vermieden werden sollte. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für Apps, die für Test- oder Produktionsumgebungen bereitgestellt werden, finden Sie unter Sichere Authentifizierungsflüsse.
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, diebuilder.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 inConfigurationOptions
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.
Warnung
In diesem Artikel wird die Verwendung von Verbindungszeichenfolge gezeigt. Bei einer lokalen Datenbank muss der Benutzer nicht authentifiziert werden, aber in der Produktion enthalten Verbindungszeichenfolge manchmal ein Kennwort für die Authentifizierung. Ein Ressourcenbesitzer-Kennwortanmeldeinformation (ROPC) ist ein Sicherheitsrisiko, das in Produktionsdatenbanken vermieden werden sollte. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für Apps, die für Test- oder Produktionsumgebungen bereitgestellt werden, finden Sie unter Sichere Authentifizierungsflüsse.
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, diebuilder.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 inConfigurationOptions
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.
Warnung
In diesem Artikel wird die Verwendung von Verbindungszeichenfolge gezeigt. Bei einer lokalen Datenbank muss der Benutzer nicht authentifiziert werden, aber in der Produktion enthalten Verbindungszeichenfolge manchmal ein Kennwort für die Authentifizierung. Ein Ressourcenbesitzer-Kennwortanmeldeinformation (ROPC) ist ein Sicherheitsrisiko, das in Produktionsdatenbanken vermieden werden sollte. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für Apps, die für Test- oder Produktionsumgebungen bereitgestellt werden, finden Sie unter Sichere Authentifizierungsflüsse.
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, diebuilder.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 inConfigurationOptions
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.
Warnung
In diesem Artikel wird die Verwendung von Verbindungszeichenfolge gezeigt. Bei einer lokalen Datenbank muss der Benutzer nicht authentifiziert werden, aber in der Produktion enthalten Verbindungszeichenfolge manchmal ein Kennwort für die Authentifizierung. Ein Ressourcenbesitzer-Kennwortanmeldeinformation (ROPC) ist ein Sicherheitsrisiko, das in Produktionsdatenbanken vermieden werden sollte. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für Apps, die für Test- oder Produktionsumgebungen bereitgestellt werden, finden Sie unter Sichere Authentifizierungsflüsse.
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 inConfigurationOptions
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.
Warnung
In diesem Artikel wird die Verwendung von Verbindungszeichenfolge gezeigt. Bei einer lokalen Datenbank muss der Benutzer nicht authentifiziert werden, aber in der Produktion enthalten Verbindungszeichenfolge manchmal ein Kennwort für die Authentifizierung. Ein Ressourcenbesitzer-Kennwortanmeldeinformation (ROPC) ist ein Sicherheitsrisiko, das in Produktionsdatenbanken vermieden werden sollte. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für Apps, die für Test- oder Produktionsumgebungen bereitgestellt werden, finden Sie unter Sichere Authentifizierungsflüsse.
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 inConfigurationOptions
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.
Warnung
In diesem Artikel wird die Verwendung von Verbindungszeichenfolge gezeigt. Bei einer lokalen Datenbank muss der Benutzer nicht authentifiziert werden, aber in der Produktion enthalten Verbindungszeichenfolge manchmal ein Kennwort für die Authentifizierung. Ein Ressourcenbesitzer-Kennwortanmeldeinformation (ROPC) ist ein Sicherheitsrisiko, das in Produktionsdatenbanken vermieden werden sollte. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für Apps, die für Test- oder Produktionsumgebungen bereitgestellt werden, finden Sie unter Sichere Authentifizierungsflüsse.
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.Redis
AddRedis 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.Redis
AddRedis 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.
Warnung
In diesem Artikel wird die Verwendung von Verbindungszeichenfolge gezeigt. Bei einer lokalen Datenbank muss der Benutzer nicht authentifiziert werden, aber in der Produktion enthalten Verbindungszeichenfolge manchmal ein Kennwort für die Authentifizierung. Ein Ressourcenbesitzer-Kennwortanmeldeinformation (ROPC) ist ein Sicherheitsrisiko, das in Produktionsdatenbanken vermieden werden sollte. Produktions-Apps sollten den sichersten verfügbaren Ablauf für die Authentifizierung verwenden. Weitere Informationen zur Authentifizierung für Apps, die für Test- oder Produktionsumgebungen bereitgestellt werden, finden Sie unter Sichere Authentifizierungsflüsse.
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
-MethodeAddRedis
nachAddSignalR
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:
ASP.NET Core