Skalowanie z Redis Backplane
Skaluj SignalR na wielu serwerach za pomocą Redis backplane, aby synchronizować komunikaty między instancjami.
Skalowanie z Redis Backplane to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Problem wielu serwerów
Gdy SignalR działa na jednym serwerze, klienci i serwer współdzielą pamięć zawierającą informacje o połączeniach i grupach. Po skalowaniu do co najmniej dwóch serwerów każdy z nich zna tylko własne połączenia — wiadomość wysłana na serwerze A nigdy nie dociera do klientów połączonych z serwerem B.
Czym jest backplane?
Backplane to współdzielony magistrala komunikatów między instancjami serwera SignalR. Gdy jeden serwer chce wysłać wiadomość, publikuje ją w backplane; wszystkie serwery ją odbierają i przekazują do swoich lokalnych połączeń.
Dodawanie backplane Redis
Należy zainstalować pakiet Microsoft.AspNetCore.SignalR.StackExchangeRedis i wywołać AddStackExchangeRedis() po AddSignalR().
// 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")!);Jak działa Redis Pub/Sub w SignalR
Każdy serwer SignalR subskrybuje kanały Redis. Gdy serwer A publikuje wiadomość dotyczącą grupy lub użytkownika, Redis dostarcza ją wszystkim subskrybentom (serwerom B, C…), które następnie przekazują ją do swoich lokalnych połączeń.
// 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 themOpcje konfiguracji
W środowisku produkcyjnym należy dostroić połączenie z Redisem, konfigurując TLS, hasło, odporność połączenia oraz prefiks kanału pub/sub.
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 Service
W celu w pełni zarządzanego skalowania należy użyć Azure SignalR Service. Usługa pełni funkcję backplane i menedżera połączeń — serwery aplikacji stają się bezstanowe i nie utrzymują bezpośrednio połączeń WebSocket.
// 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 neededSesje sticky (rozwiązanie awaryjne dla transportu innego niż WebSocket)
W przypadku używania Server-Sent Events lub Long Polling (a nie WebSockets) ten sam klient musi zawsze trafiać do tego samego serwera — nazywa się to sticky sessions. Należy skonfigurować tę funkcję w module równoważenia obciążenia lub odwrotnym serwerze proxy.
# 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 serverGrupy na wielu serwerach
Członkostwo w grupach jest utrzymywane przez backplane. Dodanie połączenia do grupy na serwerze A sprawia, że serwer B wie o tym dzięki Redisowi — kod aplikacji nie musi wykonywać żadnych dodatkowych czynności.
// 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 distributionMonitorowanie Redis Pub/Sub
Należy monitorować kanały Redis, aby weryfikować ruch SignalR i diagnozować problemy. Do obserwowania przepływu komunikatów można użyć redis-cli SUBSCRIBE lub Redis Insights.
# 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"Obsługa awarii Redis
Jeśli Redis stanie się niedostępny, SignalR przełączy się w tryb wyłącznie lokalny — wiadomości nie będą przekazywane między serwerami. Należy skonfigurować zasady ponawiania prób oraz alerty dotyczące łączności z Redisem.
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);
});Praktyczny przykład: skalowalna architektura czatu
W środowisku produkcyjnym należy uruchomić co najmniej 3 instancje serwera SignalR za modułem równoważenia obciążenia, używając Redis lub Azure SignalR Service jako backplane. Cały stan jest przechowywany w Redisie, a serwery są bezstanowe i można je swobodnie zastępować.
// 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=3Szybkie sprawdzenie
Jaki problem rozwiązuje backplane SignalR?
Podsumowanie: skalowanie za pomocą backplane Redis
Najważniejsze informacje:
- Bez backplane wiadomości z jednego serwera nie docierają do klientów innych serwerów
- AddStackExchangeRedis() dodaje backplane Redis oparty na mechanizmie pub/sub w sposób transparentny dla aplikacji
- Azure SignalR Service zapewnia w pełni zarządzaną, bezserwerową alternatywę dla backplane
- W przypadku transportów innych niż WebSocket (SSE, Long Polling) wymagane są sesje sticky
- Członkostwo w grupach jest synchronizowane między serwerami za pośrednictwem backplane
- Należy skonfigurować AbortOnConnectFail=false oraz zasady ponawiania prób, aby zapewnić odporność połączenia z Redisem
Często zadawane pytania
Czy lekcja „Skalowanie z Redis Backplane” jest bezpłatna?
Tak — pełny tekst „Skalowanie z Redis Backplane” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Skalowanie z Redis Backplane”?
Skaluj SignalR na wielu serwerach za pomocą Redis backplane, aby synchronizować komunikaty między instancjami. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Skalowanie z Redis Backplane”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Huby i połączenia SignalR
- Grupy, użytkownicy i zarządzanie połączeniami
- Silnie typowane huby
- Skalowanie z Redis Backplane