Nastavení propojovacího roviny Redis pro ASP.NET Core SignalR horizontálního navýšení velikosti
Andrew Stanton-Nurse, Brady Gastera Tom Dykstra
Tento článek vysvětluje konkrétní aspekty nastavení serveru Redis pro horizontální navýšení SignalR kapacity ASP.NET Core SignalR aplikace.
Nastavení propojovacího roviny Redis
Nasaďte server Redis.
Důležité
Pro použití v produkčním prostředí se propojovací rozhraní Redis doporučuje jenom v případě, že běží ve stejném datovém centru jako SignalR aplikace. Jinak latence sítě snižuje výkon. Pokud je SignalR vaše aplikace spuštěná v cloudu Azure, doporučujeme místo propojovacího rozhraní Redis použít službu Azure SignalR Service.
Další informace naleznete v následujících zdrojích:
V SignalR aplikaci nainstalujte balíček
Microsoft.AspNetCore.SignalR.RedisNuGet.V
Startup.ConfigureServicesmetodě volejteAddRedispoAddSignalR:services.AddSignalR().AddRedis("<your_Redis_connection_string>");Podle potřeby nakonfigurujte možnosti:
Většinu možností lze nastavit v připojovacím řetězci nebo v objektu ConfigurationOptions. Možnosti zadané v
ConfigurationOptionspřepíší ty, které jsou nastavené v připojovacím řetězci.Následující příklad ukazuje, jak nastavit možnosti v
ConfigurationOptionsobjektu . Tento příklad přidá předponu kanálu, aby několik aplikací sdílelo stejnou instanci Redis, jak je vysvětleno v následujícím kroku.services.AddSignalR() .AddRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });V předchozím kódu se inicializuje s
options.Configurationčímkoli, co bylo zadáno v připojovacím řetězci.
V SignalR aplikaci nainstalujte jeden z následujících balíčků NuGet souborů:
Microsoft.AspNetCore.SignalR.StackExchangeRedis– Závisí na StackExchange.Redis 2.X.X. Toto je doporučený balíček pro ASP.NET Core 2.2 a novější.Microsoft.AspNetCore.SignalR.Redis– Závisí na StackExchange.Redis 1.X.X. Tento balíček není součástí verze ASP.NET Core 3.0 a novější.
V
Startup.ConfigureServicesmetodě volejte AddStackExchangeRedis :services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
Při použití Microsoft.AspNetCore.SignalR.Redis volejte AddRedis .
Podle potřeby nakonfigurujte možnosti:
Většinu možností lze nastavit v připojovacím řetězci nebo v objektu ConfigurationOptions. Možnosti zadané v
ConfigurationOptionspřepíší ty, které jsou nastavené v připojovacím řetězci.Následující příklad ukazuje, jak nastavit možnosti v
ConfigurationOptionsobjektu . Tento příklad přidá předponu kanálu, aby několik aplikací sdílelo stejnou instanci Redis, jak je vysvětleno v následujícím kroku.services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });
Při použití Microsoft.AspNetCore.SignalR.Redis volejte AddRedis .
V předchozím kódu se inicializuje s options.Configuration čímkoli, co bylo zadáno v připojovacím řetězci.
Informace o možnostech Redis najdete v dokumentaci k StackExchange Redis.
V SignalR aplikaci nainstalujte následující NuGet balíčku:
Microsoft.AspNetCore.SignalR.StackExchangeRedis
V
Startup.ConfigureServicesmetodě volejte AddStackExchangeRedis :services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");Podle potřeby nakonfigurujte možnosti:
Většinu možností lze nastavit v připojovacím řetězci nebo v objektu ConfigurationOptions. Možnosti zadané v
ConfigurationOptionspřepíší ty, které jsou nastavené v připojovacím řetězci.Následující příklad ukazuje, jak nastavit možnosti v
ConfigurationOptionsobjektu . Tento příklad přidá předponu kanálu, aby několik aplikací sdílelo stejnou instanci Redis, jak je vysvětleno v následujícím kroku.services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });V předchozím kódu se inicializuje s
options.Configurationčímkoli, co bylo zadáno v připojovacím řetězci.Informace o možnostech Redis najdete v dokumentaci k StackExchange Redis.
Pokud používáte jeden server Redis pro více aplikací, použijte pro každou aplikaci SignalR jinou předponu SignalR kanálu.
Nastavení předpony kanálu izoluje SignalR jednu aplikaci od ostatních, které používají jiné předpony kanálu. Pokud přiřazování různých předpon nezadáte, zpráva odeslaná z jedné aplikace všem vlastním klientům se zobrazí všem klientům všech aplikací, které používají server Redis jako propojovací rozhraní.
Nakonfigurujte software pro vyrovnávání zatížení serverové farmy pro přichycené relace. Tady je několik příkladů dokumentace, jak to udělat:
Chyby serveru Redis
Když server Redis přejde do stavu dolů, SignalR vyvolá výjimky, které indikují, že zprávy nebudou doručeny. Některé typické zprávy o výjimce:
- Neúspěšný zápis zprávy
- Nepodařilo se vyvolat metodu centra MethodName.
- Připojení k Redis selhalo
SignalR nenasauje zprávy do vyrovnávací paměti, aby je po návratu serveru posílala do vyrovnávací paměti. Všechny zprávy odeslané v době, kdy je server Redis mimo systém, se ztratí.
SignalR se automaticky znovu připojí, jakmile bude server Redis opět dostupný.
Vlastní chování při selhání připojení
Tady je příklad, který ukazuje, jak zpracovat události selhání připojení 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;
};
});
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
Clustering Redis je metoda pro dosažení vysoké dostupnosti pomocí několika serverů Redis. Clustering se oficiálně nepodporuje, ale může to fungovat.
Další kroky
Další informace naleznete v následujících zdrojích: