Redis Backplane ile Ölçekleme
Örnekler arasındaki iletileri eşitlemek için Redis backplane kullanarak SignalR'ı birden çok sunucuda ölçeklendirin.
Redis Backplane ile Ölçekleme, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Çok Sunuculu Ortam Sorunu
SignalR tek bir sunucuda çalışırken istemciler ve sunucu, bağlantılar ve gruplar için belleği paylaşır. İki veya daha fazla sunucuya ölçeklediğinizde her sunucu yalnızca kendi bağlantılarını bilir — Sunucu A'da gönderilen bir ileti, Sunucu B'ye bağlı istemcilere hiçbir zaman ulaşmaz.
Arka Plan Veri Yolu Nedir?
Arka plan veri yolu, SignalR sunucu örnekleri arasındaki paylaşılan ileti veri yoludur. Bir sunucu ileti göndermek istediğinde iletiyi arka plan veri yoluna yayınlar; tüm sunucular iletiyi alır ve yerel bağlantılarına iletir.
Redis Arka Plan Veri Yolunu Ekleme
Microsoft.AspNetCore.SignalR.StackExchangeRedis paketini yükleyin ve AddSignalR() çağrısından sonra AddStackExchangeRedis() çağrısını yapın.
// dotnet add package Microsoft.AspNetCore.SignalR.StackExchangeRedis
builder.Services.AddSignalR()
.AddStackExchangeRedis("localhost:6379", options =>
{
options.Configuration.ChannelPrefix =
RedisChannel.Literal("myapp"); // namespace your channels
});
// Or from config:
// .AddStackExchangeRedis(builder.Configuration.GetConnectionString("Redis")!);Redis Yayınlama/Abonelik İşlemlerinin SignalR İçin Çalışma Şekli
Her SignalR sunucusu Redis kanallarına abone olur. Sunucu A bir grup veya kullanıcı için ileti yayınladığında Redis, iletiyi tüm abonelere (Sunucu B, C… gibi) iletir; bu sunucular da iletiyi yerel bağlantılarına yönlendirir.
// Server A: client sends message
// Hub on Server A calls:
await Clients.Group("room-42").ReceiveMessage(user, msg);
// Internally SignalR publishes to Redis:
// PUBLISH signalr/myapp/group/room-42 <serialized message>
// Redis delivers to Server B and C
// Both servers find connections in "room-42" and push to themYapılandırma Seçenekleri
Üretim ortamı için Redis bağlantısını ayrıntılı şekilde ayarlayın: TLS, parola, bağlantı dayanıklılığı ve yayınlama/abonelik kanal öneki.
builder.Services.AddSignalR()
.AddStackExchangeRedis(opts =>
{
opts.Configuration = ConfigurationOptions.Parse(
builder.Configuration["Redis:ConnectionString"]!);
opts.Configuration.Password = builder.Configuration["Redis:Password"];
opts.Configuration.Ssl = true;
opts.Configuration.AbortOnConnectFail = false;
opts.Configuration.ConnectRetry = 3;
});Azure SignalR Hizmeti
Tamamen yönetilen ölçeklendirme için Azure SignalR Hizmeti'ni kullanın. Bu hizmet, arka plan veri yolu ve bağlantı yöneticisi olarak çalışır — uygulama sunucularınız durum tutmaz hâle gelir ve WebSocket bağlantılarını kendileri barındırmaz.
// dotnet add package Microsoft.Azure.SignalR
builder.Services.AddSignalR()
.AddAzureSignalR(builder.Configuration["Azure:SignalR:ConnectionString"]!);
// That's it — Azure manages all connections and backplane
// Your server scales to zero when not neededYapışkan Oturumlar (WebSocket Olmayan Aktarım için Yedek Çözüm)
Sunucu Tarafından Gönderilen Olaylar veya Uzun Yoklama kullanıldığında (WebSockets kullanılmadığında), aynı istemci her zaman aynı sunucuya ulaşmalıdır — buna yapışkan oturumlar denir. Bunu yük dengeleyicinizde veya ters proxy'nizde yapılandırın.
# Nginx: sticky session config (IP hash)
upstream signalr_servers {
ip_hash; # ensures same client hits same server
server server1:5000;
server server2:5000;
server server3:5000;
}
# Or use cookie-based sticky sessions:
# sticky cookie srv_id expires=1h;
# WebSockets don't need sticky sessions —
# the connection is long-lived on one serverBirden Çok Sunucuda Gruplar
Grup üyeliği arka plan veri yolu tarafından korunur. Sunucu A'da bir bağlantının gruba eklenmesi, Redis aracılığıyla Sunucu B tarafından da bilinir — bu durum uygulama kodu için şeffaftır.
// This works correctly across servers:
public async Task JoinRoom(string room)
{
// Adds to Redis-backed group
await Groups.AddToGroupAsync(Context.ConnectionId, room);
// Clients.Group sends via Redis to all servers
await Clients.Group(room).UserJoined(Context.User!.Identity!.Name!);
}
// No code changes needed — the Redis backplane handles distributionRedis Yayınlama/Abonelik İşlemlerini İzleme
SignalR trafiğini doğrulamak ve sorunları tanılamak için Redis kanallarını izleyin. İleti akışını gözlemlemek üzere redis-cli SUBSCRIBE veya Redis Insights kullanın.
# redis-cli: monitor all SignalR channels
redis-cli PSUBSCRIBE "myapp*"
# Check active channel subscribers
redis-cli PUBSUB CHANNELS "myapp*"
# Check number of subscribers per channel
redis-cli PUBSUB NUMSUB "myapp/all"Redis Hatalarını Yönetme
Redis kullanılamaz hâle gelirse SignalR yalnızca yerel modda çalışmaya geçer — iletiler sunucular arasında geçmez. Redis bağlantısı için yeniden deneme ilkeleri ve uyarılar yapılandırın.
builder.Services.AddSignalR()
.AddStackExchangeRedis(opts =>
{
opts.Configuration = ConfigurationOptions.Parse(redisConn);
opts.Configuration.AbortOnConnectFail = false; // don't crash app
opts.Configuration.ConnectRetry = 5;
opts.Configuration.ReconnectRetryPolicy =
new ExponentialRetry(5000, maxDeltaBackoffMilliseconds: 60000);
});Gerçek Dünya: Ölçeklenmiş Sohbet Mimarisi
Üretimde, bir yük dengeleyicinin arkasında 3 veya daha fazla SignalR sunucu örneği çalıştırın ve Redis'i (veya Azure SignalR Hizmeti'ni) arka plan veri yolu olarak kullanın. Tüm durum Redis'te tutulur; sunucular durum tutmaz ve gerektiğinde devreden çıkarılabilir.
// Architecture:
// [Browser] -> [Load Balancer (any server, WebSocket)] ->
// [SignalR Server 1] -+
// [SignalR Server 2] -+-> [Redis Pub/Sub] -> all servers
// [SignalR Server 3] -+
// Server code is identical on all instances:
builder.Services.AddSignalR().AddStackExchangeRedis(redisConn);
app.MapHub<ChatHub>("/hubs/chat");
// Scale replicas: kubectl scale deployment chat --replicas=3Hızlı Kontrol
SignalR arka plan veri yolu hangi sorunu çözer?
Özet: Redis Arka Plan Veri Yoluyla Ölçeklendirme
Temel çıkarımlar:
- Arka plan veri yolu olmadan bir sunucudan gönderilen iletiler diğer sunuculardaki istemcilere ulaşmaz
- AddStackExchangeRedis(), şeffaf biçimde Redis yayınlama/abonelik arka plan veri yolunu ekler
- Azure SignalR Hizmeti, tamamen yönetilen ve sunucusuz bir arka plan veri yolu alternatifi sunar
- WebSocket olmayan aktarımlar için (SSE, Uzun Yoklama) yapışkan oturumlar gereklidir
- Grup üyeliği, arka plan veri yolu aracılığıyla sunucular arasında eşitlenir
- Redis dayanıklılığı için AbortOnConnectFail=false ve yeniden deneme ilkelerini yapılandırın
Sıkça Sorulan Sorular
“Redis Backplane ile Ölçekleme” dersi ücretsiz mi?
Evet — “Redis Backplane ile Ölçekleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Redis Backplane ile Ölçekleme” dersinde ne öğreneceğim?
Örnekler arasındaki iletileri eşitlemek için Redis backplane kullanarak SignalR'ı birden çok sunucuda ölçeklendirin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Redis Backplane ile Ölçekleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- SignalR Hub'ları ve Bağlantılar
- Gruplar, Kullanıcılar ve Bağlantı Yönetimi
- Güçlü Türlendirilmiş Hub'lar
- Redis Backplane ile Ölçekleme