0Pricing
C# Academy · Lekcja

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 them

Opcje 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 needed

Sesje 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 server

Grupy 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 distribution

Monitorowanie 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=3

Szybkie 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

  1. Huby i połączenia SignalR
  2. Grupy, użytkownicy i zarządzanie połączeniami
  3. Silnie typowane huby
  4. Skalowanie z Redis Backplane
← Powrót do C# Academy