Ölçeğini daha fazla ölçeklendirmek için redis ASP.NET Core SignalR planı ayarlama
Andrew Stanton-Brady, Brady Gasterve Tom Dykstra tarafından,
Bu makalede, SignalR bir redis sunucusunu bir uygulamanın ölçeğini genişletmede kullanmak üzere ayarlamanın belirli ASP.NET Core SignalR açıklanmıştır.
Redis arka plan ayarlama
Bir Redis sunucusu dağıtın.
Önemli
Üretimde kullanım için redis arka plan yalnızca uygulamayla aynı veri merkezinde çalıştırıldıklarında SignalR önerilir. Aksi takdirde, ağ gecikmesi performansı düşürebilir. Uygulamanız SignalR Azure bulut üzerinde çalışıyorsa Redis arka planı yerine Azure SignalR Hizmeti'nin kullanılması önerilir.
Daha fazla bilgi için aşağıdaki kaynaklara bakın:
Uygulamada, SignalR NuGet
Microsoft.AspNetCore.SignalR.Redisyükleyin.yönteminde
Startup.ConfigureServicesçağrısınınAddRedisAddSignalRardından:services.AddSignalR().AddRedis("<your_Redis_connection_string>");Seçenekleri gereken şekilde yapılandırma:
Çoğu seçenek bağlantı dizesinde veya ConfigurationOptions nesnesinde ayarlanabilirsiniz. içinde belirtilen
ConfigurationOptionsseçenekler, bağlantı dizesinde ayarlanmış olanları geçersiz kılar.Aşağıdaki örnekte, nesnesinde seçeneklerin nasıl ayarlay olduğu
ConfigurationOptionsgösterir. Bu örnek, aşağıdaki adımda açıklanan şekilde birden çok uygulamanın aynı Redis örneğini paylaşarak bir kanal ön eki ekler.services.AddSignalR() .AddRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });Yukarıdaki kodda,
options.Configurationbağlantı dizesinde belirtilen değerle başlatılır.
Uygulamada SignalR aşağıdaki paketlerden birini NuGet:
Microsoft.AspNetCore.SignalR.StackExchangeRedis- StackExchange.Redis 2.X.X'e bağlıdır. Bu, 2.2 ve ASP.NET Core için önerilen pakettir.Microsoft.AspNetCore.SignalR.Redis- StackExchange.Redis 1.X.X'e bağlıdır. Bu paket, 3.0 ve ASP.NET Core pakete dahil değildir.
yönteminde
Startup.ConfigureServicesçağrısında: AddStackExchangeRedisservices.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
kullanırken Microsoft.AspNetCore.SignalR.Redis çağrısı. AddRedis
Seçenekleri gereken şekilde yapılandırma:
Çoğu seçenek bağlantı dizesinde veya ConfigurationOptions nesnesinde ayarlanabilirsiniz. içinde belirtilen
ConfigurationOptionsseçenekler, bağlantı dizesinde ayarlanmış olanları geçersiz kılar.Aşağıdaki örnekte, nesnesinde seçeneklerin nasıl ayarlay olduğu
ConfigurationOptionsgösterir. Bu örnek, aşağıdaki adımda açıklanan şekilde birden çok uygulamanın aynı Redis örneğini paylaşarak bir kanal ön eki ekler.services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });
kullanırken Microsoft.AspNetCore.SignalR.Redis çağrısı. AddRedis
Yukarıdaki kodda, options.Configuration bağlantı dizesinde belirtilen değerle başlatılır.
Redis seçenekleri hakkında bilgi için StackExchange Redis belgelerine bakın.
Uygulamada, SignalR aşağıdaki NuGet yükleyin:
Microsoft.AspNetCore.SignalR.StackExchangeRedis
yönteminde
Startup.ConfigureServicesçağrısında: AddStackExchangeRedisservices.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");Seçenekleri gereken şekilde yapılandırma:
Çoğu seçenek bağlantı dizesinde veya ConfigurationOptions nesnesinde ayarlanabilirsiniz. içinde belirtilen
ConfigurationOptionsseçenekler, bağlantı dizesinde ayarlanmış olanları geçersiz kılar.Aşağıdaki örnekte, nesnesinde seçeneklerin nasıl ayarlay olduğu
ConfigurationOptionsgösterir. Bu örnek, aşağıdaki adımda açıklanan şekilde birden çok uygulamanın aynı Redis örneğini paylaşarak bir kanal ön eki ekler.services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });Yukarıdaki kodda,
options.Configurationbağlantı dizesinde belirtilen değerle başlatılır.Redis seçenekleri hakkında bilgi için StackExchange Redis belgelerine bakın.
Birden çok uygulama için bir Redis sunucusu SignalR kullanıyorsanız, her uygulama için farklı bir kanal ön eki SignalR kullanın.
Kanal ön eki ayarı, bir SignalR uygulamayı farklı kanal ön ekleri kullanan diğer uygulamalardan yalıtır. Farklı ön ekler atamayacaksanız, bir uygulamanın kendi istemcilerinin tamamlarına gönderilen bir ileti, Redis sunucusunu kullanan tüm uygulamaların tüm istemcilerine bir arka plan olarak gider.
Sunucu grubu yük dengeleme yazılımınızı yapışkan oturumlar için yapılandırma. Bunun nasıl yap örnekleri aşağıda verilmiştir:
Redis sunucusu hataları
Bir Redis sunucusu SignalR kapatılana kadar iletilerin teslim olmadığını belirten özel durumlar oluşturur. Bazı tipik özel durum iletileri:
- İleti yazılamadı
- 'MethodName' hub yöntemi çağrılaamadı
- Redis bağlantısı başarısız oldu
SignalR , sunucu geri geldiğinde iletileri göndermek için arabelleğe almaz. Redis sunucusu çalışırken gönderilen iletiler kaybolur.
SignalR Redis sunucusu yeniden kullanılabilir olduğunda otomatik olarak yeniden bağlanır.
Bağlantı hataları için özel davranış
Redis bağlantı hatası olaylarını işlemeyi gösteren bir örnek burada veserdedir.
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 Kümeleme
Redis Kümeleme, birden çok Redis sunucusu kullanarak yüksek kullanılabilirlik elde etmek için kullanılan bir yöntemdir. Kümeleme resmi olarak desteklenmez, ancak işe de kullanılabilir.
Sonraki adımlar
Daha fazla bilgi için aşağıdaki kaynaklara bakın: