0Pricing
C# Academy · 강의

Redis 백플레인으로 확장하기

Redis 백플레인을 사용해 여러 서버에서 SignalR을 확장하고 인스턴스 간 메시지를 동기화합니다.

Redis 백플레인으로 확장하기은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

다중 서버 문제

SignalR이 단일 서버에서 실행될 때는 클라이언트와 서버가 연결 및 그룹 정보를 메모리에서 공유합니다. 서버를 두 대 이상으로 확장하면 각 서버는 자신의 연결만 알고 있으므로 Server A에서 보낸 메시지는 Server B에 연결된 클라이언트에 도달하지 않습니다.

백플레인이란 무엇인가요

백플레인은 SignalR 서버 인스턴스 사이에서 공유하는 메시지 버스입니다. 한 서버가 메시지를 보내려 하면 백플레인에 게시하고, 모든 서버가 이를 받아 각자의 로컬 연결로 전달합니다.

Redis 백플레인 추가

Microsoft.AspNetCore.SignalR.StackExchangeRedis 패키지를 설치하고 AddSignalR() 다음에 AddStackExchangeRedis()를 호출하십시오.

// 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")!);

SignalR에서 Redis 게시/구독이 작동하는 방식

각 SignalR 서버는 Redis 채널을 구독합니다. Server A가 그룹이나 사용자에게 보낼 메시지를 게시하면 Redis가 모든 구독자(Server B, C 등)에게 전달하고, 각 서버는 이를 로컬 연결로 전달합니다.

// 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

구성 옵션

프로덕션 환경에 맞게 Redis 연결을 세밀하게 조정하십시오. TLS, 비밀번호, 연결 복원력 및 게시/구독 채널 접두사를 설정할 수 있습니다.

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 서비스

완전 관리형 확장을 원한다면 Azure SignalR Service를 사용하십시오. 이 서비스가 백플레인과 연결 관리자의 역할을 하므로 애플리케이션 서버는 상태 비저장 방식으로 동작하며 자체적으로 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

고정 세션(WebSocket이 아닌 전송을 위한 대체 수단)

서버 전송 이벤트나 롱 폴링(WebSockets가 아님)을 사용할 때는 동일한 클라이언트가 항상 같은 서버에 연결되어야 하며, 이를 고정 세션이라고 합니다. 부하 분산 장치나 역방향 프록시에서 이를 구성하십시오.

# 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

여러 서버에서의 그룹 사용

백플레인이 그룹 멤버십을 관리합니다. Server A에서 연결을 그룹에 추가하면 Redis를 통해 Server B도 이를 알게 되므로 애플리케이션 코드에서는 이를 신경 쓸 필요가 없습니다.

// 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

Redis 게시/구독 모니터링

Redis 채널을 모니터링하여 SignalR 트래픽을 확인하고 문제를 진단하십시오. redis-cli SUBSCRIBE 또는 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"

Redis 장애 처리

Redis를 사용할 수 없게 되면 SignalR은 로컬 전용 모드로 대체됩니다. 따라서 메시지가 서버 간에 전달되지 않습니다. Redis 연결을 위한 재시도 정책과 알림을 구성하십시오.

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);
    });

실전: 확장된 채팅 아키텍처

프로덕션 환경에서는 부하 분산 장치 뒤에 3개 이상의 SignalR 서버 인스턴스를 실행하고 Redis(또는 Azure SignalR Service)를 백플레인으로 사용합니다. 모든 상태는 Redis에 저장하고 서버는 상태 비저장 방식으로 실행하여 필요할 때 교체할 수 있게 합니다.

// 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

빠른 확인

SignalR 백플레인은 어떤 문제를 해결합니까?

요약: Redis 백플레인을 사용한 확장

핵심 내용:

  • 백플레인이 없으면 한 서버의 메시지가 다른 서버의 클라이언트에 도달하지 않습니다
  • AddStackExchangeRedis()가 Redis 게시/구독 백플레인을 투명하게 추가합니다
  • Azure SignalR Service는 완전 관리형 서버리스 백플레인 대안을 제공합니다
  • WebSocket이 아닌 전송(SSE, 롱 폴링)에는 고정 세션이 필요합니다
  • 백플레인을 통해 여러 서버에서 그룹 멤버십이 동기화됩니다
  • Redis의 복원력을 높이려면 AbortOnConnectFail=false와 재시도 정책을 구성합니다

자주 묻는 질문

“Redis 백플레인으로 확장하기” 강의는 무료인가요?

네 — “Redis 백플레인으로 확장하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Redis 백플레인으로 확장하기”에서 뭘 배우나요?

Redis 백플레인을 사용해 여러 서버에서 SignalR을 확장하고 인스턴스 간 메시지를 동기화합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“Redis 백플레인으로 확장하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. SignalR 허브와 연결
  2. 그룹, 사용자와 연결 관리
  3. 강력한 형식의 허브
  4. Redis 백플레인으로 확장하기
← C# Academy(으)로 돌아가기