ASP.NET Core SignalR 스케일 아웃에 대한 Redis 백플레인 설정

앤드류 스탠튼 간호사, 브래디 가스터, 톰 다이크스트라.

이 문서에서는 ASP.NET Core SignalR 앱을 스케일 아웃하는 데 사용할 Redis 서버 설정의 SignalR 특정 측면을 설명합니다.

Redis 백플레인 설정

  • Redis 서버를 배포합니다.

    Important

    프로덕션 사용을 위해 Redis 백플레인은 SignalR 앱과 동일한 데이터 센터에서 실행되는 경우에만 권장됩니다. 그렇지 않으면 네트워크 대기 시간이 성능을 저하시킵니다. SignalR 앱이 Azure 클라우드에서 실행되는 경우 Redis 백플레인 대신 Azure SignalR Service를 권장합니다.

    자세한 내용은 다음 리소스를 참조하세요.

  • SignalR 앱에서 다음 NuGet 패키지를 설치합니다.

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • 파일에서 )를 호출하는 줄 앞에 다음 줄을 추가하여 호출 AddStackExchangeRedisbuilder.Build()합니다 Program.cs .

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • 필요에 따라 옵션을 구성합니다.

    대부분의 옵션은 연결 문자열 또는 개체에서 ConfigurationOptions 설정할 수 있습니다. ConfigurationOptions에 지정된 옵션은 연결 문자열에 설정된 옵션을 재정의합니다.

    다음 예제에서는 ConfigurationOptions 개체의 옵션을 설정하는 방법을 보여 줍니다. 이 예제에서는 다음 단계에 설명된 것처럼 여러 앱이 동일한 Redis 인스턴스를 공유할 수 있도록 채널 접두사를 추가합니다.

    builder.Services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp");
      });
    

    위의 코드에서 options.Configuration은 연결 문자열에 지정된 항목을 사용하여 초기화됩니다.

    Redis 옵션에 대한 자세한 내용은 StackExchange Redis 설명서를 참조하세요.

  • 여러 SignalR 앱에 대해 하나의 Redis 서버를 사용하는 경우 각 SignalR 앱에 대해 다른 채널 접두사를 사용합니다.

    채널 접두사를 설정하면 다른 채널 접두사를 사용하는 다른 앱에서 하나의 SignalR 앱을 격리합니다. 서로 다른 접두사를 할당하지 않으면 한 앱에서 모든 자체 클라이언트로 전송되는 메시지는 Redis 서버를 백플레인으로 사용하는 모든 앱의 모든 클라이언트로 이동합니다.

  • 고정 세션에 대해 서버 팜 부하 분산 소프트웨어를 구성합니다. 이 작업을 수행하는 방법에 대한 설명서의 몇 가지 예제는 다음과 같습니다.

Redis 서버 오류

Redis 서버 작동이 중단되면 SignalR에서 메시지가 전달되지 않음을 나타내는 예외가 throw됩니다. 몇 가지 일반적인 예외 메시지:

  • 메시지를 쓰지 못했습니다.
  • 'MethodName' 허브 메서드를 호출하지 못했습니다.
  • Redis에 연결하지 못했습니다.

SignalR은 서버를 백업할 때 메시지를 보내도록 버퍼링하지 않습니다. Redis 서버를 종료하는 동안 전송된 모든 메시지는 손실됩니다.

SignalR은 Redis 서버를 다시 사용할 수 있게 되면 자동으로 다시 연결합니다.

연결 실패에 대한 사용자 지정 동작

Redis 연결 실패 이벤트를 처리하는 방법을 보여 주는 예제는 다음과 같습니다.

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 클러스터

Redis 클러스터 는 동시에 활성화된 여러 Redis 서버를 활용하여 고가용성을 달성합니다. Redis 클러스터를 백 SignalR플레인으로 사용하는 경우 메시지는 앱을 코드 수정하지 않고 클러스터의 모든 노드에 전달됩니다.

클러스터의 노드 수와 백플레인의 처리량 간에는 절충이 있습니다. 노드 수를 늘리면 클러스터의 가용성이 증가하지만 메시지가 클러스터의 모든 노드로 전송되어야 하므로 처리량이 줄어듭니다.

SignalR 앱에서 다음 방법 중 하나를 사용하여 가능한 모든 Redis 노드를 포함합니다.

  • 쉼표로 구분된 연결 문자열 노드를 나열합니다.
  • 연결 실패에 사용자 지정 동작을 사용하는 경우 노드를 추가합니다 ConfigurationOptions.Endpoints.

다음 단계

자세한 내용은 다음 리소스를 참조하세요.

이 문서에서는 ASP.NET Core SignalR 앱을 스케일 아웃하는 데 사용할 Redis 서버 설정의 SignalR 특정 측면을 설명합니다.

Redis 백플레인 설정

  • Redis 서버를 배포합니다.

    Important

    프로덕션 사용을 위해 Redis 백플레인은 SignalR 앱과 동일한 데이터 센터에서 실행되는 경우에만 권장됩니다. 그렇지 않으면 네트워크 대기 시간이 성능을 저하시킵니다. SignalR 앱이 Azure 클라우드에서 실행되는 경우 Redis 백플레인 대신 Azure SignalR Service를 권장합니다.

    자세한 내용은 다음 리소스를 참조하세요.

  • SignalR 앱에서 다음 NuGet 패키지를 설치합니다.

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • 파일에서 )를 호출하는 줄 앞에 다음 줄을 추가하여 호출 AddStackExchangeRedisbuilder.Build()합니다 Program.cs .

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • 필요에 따라 옵션을 구성합니다.

    대부분의 옵션은 연결 문자열 또는 개체에서 ConfigurationOptions 설정할 수 있습니다. ConfigurationOptions에 지정된 옵션은 연결 문자열에 설정된 옵션을 재정의합니다.

    다음 예제에서는 ConfigurationOptions 개체의 옵션을 설정하는 방법을 보여 줍니다. 이 예제에서는 다음 단계에 설명된 것처럼 여러 앱이 동일한 Redis 인스턴스를 공유할 수 있도록 채널 접두사를 추가합니다.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    위의 코드에서 options.Configuration은 연결 문자열에 지정된 항목을 사용하여 초기화됩니다.

    Redis 옵션에 대한 자세한 내용은 StackExchange Redis 설명서를 참조하세요.

  • 여러 SignalR 앱에 대해 하나의 Redis 서버를 사용하는 경우 각 SignalR 앱에 대해 다른 채널 접두사를 사용합니다.

    채널 접두사를 설정하면 다른 채널 접두사를 사용하는 다른 앱에서 하나의 SignalR 앱을 격리합니다. 서로 다른 접두사를 할당하지 않으면 한 앱에서 모든 자체 클라이언트로 전송되는 메시지는 Redis 서버를 백플레인으로 사용하는 모든 앱의 모든 클라이언트로 이동합니다.

  • 고정 세션에 대해 서버 팜 부하 분산 소프트웨어를 구성합니다. 이 작업을 수행하는 방법에 대한 설명서의 몇 가지 예제는 다음과 같습니다.

Redis 서버 오류

Redis 서버 작동이 중단되면 SignalR에서 메시지가 전달되지 않음을 나타내는 예외가 throw됩니다. 몇 가지 일반적인 예외 메시지:

  • 메시지를 쓰지 못했습니다.
  • 'MethodName' 허브 메서드를 호출하지 못했습니다.
  • Redis에 연결하지 못했습니다.

SignalR은 서버를 백업할 때 메시지를 보내도록 버퍼링하지 않습니다. Redis 서버를 종료하는 동안 전송된 모든 메시지는 손실됩니다.

SignalR은 Redis 서버를 다시 사용할 수 있게 되면 자동으로 다시 연결합니다.

연결 실패에 대한 사용자 지정 동작

Redis 연결 실패 이벤트를 처리하는 방법을 보여 주는 예제는 다음과 같습니다.

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 클러스터

Redis 클러스터 는 동시에 활성화된 여러 Redis 서버를 활용하여 고가용성을 달성합니다. Redis 클러스터를 백 SignalR플레인으로 사용하는 경우 메시지는 앱을 코드 수정하지 않고 클러스터의 모든 노드에 전달됩니다.

클러스터의 노드 수와 백플레인의 처리량 간에는 절충이 있습니다. 노드 수를 늘리면 클러스터의 가용성이 증가하지만 메시지가 클러스터의 모든 노드로 전송되어야 하므로 처리량이 줄어듭니다.

SignalR 앱에서 다음 방법 중 하나를 사용하여 가능한 모든 Redis 노드를 포함합니다.

  • 쉼표로 구분된 연결 문자열 노드를 나열합니다.
  • 연결 실패에 사용자 지정 동작을 사용하는 경우 노드를 추가합니다 ConfigurationOptions.Endpoints.

다음 단계

자세한 내용은 다음 리소스를 참조하세요.

이 문서에서는 ASP.NET Core SignalR 앱을 스케일 아웃하는 데 사용할 Redis 서버 설정의 SignalR 특정 측면을 설명합니다.

Redis 백플레인 설정

  • Redis 서버를 배포합니다.

    Important

    프로덕션 사용을 위해 Redis 백플레인은 SignalR 앱과 동일한 데이터 센터에서 실행되는 경우에만 권장됩니다. 그렇지 않으면 네트워크 대기 시간이 성능을 저하시킵니다. SignalR 앱이 Azure 클라우드에서 실행되는 경우 Redis 백플레인 대신 Azure SignalR Service를 권장합니다.

    자세한 내용은 다음 리소스를 참조하세요.

  • SignalR 앱에서 다음 NuGet 패키지를 설치합니다.

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • 파일에서 )를 호출하는 줄 앞에 다음 줄을 추가하여 호출 AddStackExchangeRedisbuilder.Build()합니다 Program.cs .

    builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • 필요에 따라 옵션을 구성합니다.

    대부분의 옵션은 연결 문자열 또는 개체에서 ConfigurationOptions 설정할 수 있습니다. ConfigurationOptions에 지정된 옵션은 연결 문자열에 설정된 옵션을 재정의합니다.

    다음 예제에서는 ConfigurationOptions 개체의 옵션을 설정하는 방법을 보여 줍니다. 이 예제에서는 다음 단계에 설명된 것처럼 여러 앱이 동일한 Redis 인스턴스를 공유할 수 있도록 채널 접두사를 추가합니다.

    builder.Services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp");
      });
    

    위의 코드에서 options.Configuration은 연결 문자열에 지정된 항목을 사용하여 초기화됩니다.

    Redis 옵션에 대한 자세한 내용은 StackExchange Redis 설명서를 참조하세요.

  • 여러 SignalR 앱에 대해 하나의 Redis 서버를 사용하는 경우 각 SignalR 앱에 대해 다른 채널 접두사를 사용합니다.

    채널 접두사를 설정하면 다른 채널 접두사를 사용하는 다른 앱에서 하나의 SignalR 앱을 격리합니다. 서로 다른 접두사를 할당하지 않으면 한 앱에서 모든 자체 클라이언트로 전송되는 메시지는 Redis 서버를 백플레인으로 사용하는 모든 앱의 모든 클라이언트로 이동합니다.

  • 고정 세션에 대해 서버 팜 부하 분산 소프트웨어를 구성합니다. 이 작업을 수행하는 방법에 대한 설명서의 몇 가지 예제는 다음과 같습니다.

Redis 서버 오류

Redis 서버 작동이 중단되면 SignalR에서 메시지가 전달되지 않음을 나타내는 예외가 throw됩니다. 몇 가지 일반적인 예외 메시지:

  • 메시지를 쓰지 못했습니다.
  • 'MethodName' 허브 메서드를 호출하지 못했습니다.
  • Redis에 연결하지 못했습니다.

SignalR은 서버를 백업할 때 메시지를 보내도록 버퍼링하지 않습니다. Redis 서버를 종료하는 동안 전송된 모든 메시지는 손실됩니다.

SignalR은 Redis 서버를 다시 사용할 수 있게 되면 자동으로 다시 연결합니다.

연결 실패에 대한 사용자 지정 동작

Redis 연결 실패 이벤트를 처리하는 방법을 보여 주는 예제는 다음과 같습니다.

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 클러스터

Redis 클러스터 는 동시에 활성화된 여러 Redis 서버를 활용하여 고가용성을 달성합니다. Redis 클러스터를 백 SignalR플레인으로 사용하는 경우 메시지는 앱을 코드 수정하지 않고 클러스터의 모든 노드에 전달됩니다.

클러스터의 노드 수와 백플레인의 처리량 간에는 절충이 있습니다. 노드 수를 늘리면 클러스터의 가용성이 증가하지만 메시지가 클러스터의 모든 노드로 전송되어야 하므로 처리량이 줄어듭니다.

SignalR 앱에서 다음 방법 중 하나를 사용하여 가능한 모든 Redis 노드를 포함합니다.

  • 쉼표로 구분된 연결 문자열 노드를 나열합니다.
  • 연결 실패에 사용자 지정 동작을 사용하는 경우 노드를 추가합니다 ConfigurationOptions.Endpoints.

다음 단계

자세한 내용은 다음 리소스를 참조하세요.

이 문서에서는 ASP.NET Core SignalR 앱을 스케일 아웃하는 데 사용할 Redis 서버 설정의 SignalR 특정 측면을 설명합니다.

Redis 백플레인 설정

  • Redis 서버를 배포합니다.

    Important

    프로덕션 사용을 위해 Redis 백플레인은 SignalR 앱과 동일한 데이터 센터에서 실행되는 경우에만 권장됩니다. 그렇지 않으면 네트워크 대기 시간이 성능을 저하시킵니다. SignalR 앱이 Azure 클라우드에서 실행되는 경우 Redis 백플레인 대신 Azure SignalR Service를 권장합니다.

    자세한 내용은 다음 리소스를 참조하세요.

  • SignalR 앱에서 다음 NuGet 패키지를 설치합니다.

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Startup.ConfigureServices 메서드에서 AddStackExchangeRedis를 호출합니다.

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • 필요에 따라 옵션을 구성합니다.

    대부분의 옵션은 연결 문자열 또는 개체에서 ConfigurationOptions 설정할 수 있습니다. ConfigurationOptions에 지정된 옵션은 연결 문자열에 설정된 옵션을 재정의합니다.

    다음 예제에서는 ConfigurationOptions 개체의 옵션을 설정하는 방법을 보여 줍니다. 이 예제에서는 다음 단계에 설명된 것처럼 여러 앱이 동일한 Redis 인스턴스를 공유할 수 있도록 채널 접두사를 추가합니다.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    위의 코드에서 options.Configuration은 연결 문자열에 지정된 항목을 사용하여 초기화됩니다.

    Redis 옵션에 대한 자세한 내용은 StackExchange Redis 설명서를 참조하세요.

  • 여러 SignalR 앱에 대해 하나의 Redis 서버를 사용하는 경우 각 SignalR 앱에 대해 다른 채널 접두사를 사용합니다.

    채널 접두사를 설정하면 다른 채널 접두사를 사용하는 다른 앱에서 하나의 SignalR 앱을 격리합니다. 서로 다른 접두사를 할당하지 않으면 한 앱에서 모든 자체 클라이언트로 전송되는 메시지는 Redis 서버를 백플레인으로 사용하는 모든 앱의 모든 클라이언트로 이동합니다.

  • 고정 세션에 대해 서버 팜 부하 분산 소프트웨어를 구성합니다. 이 작업을 수행하는 방법에 대한 설명서의 몇 가지 예제는 다음과 같습니다.

Redis 서버 오류

Redis 서버 작동이 중단되면 SignalR에서 메시지가 전달되지 않음을 나타내는 예외가 throw됩니다. 몇 가지 일반적인 예외 메시지:

  • 메시지를 쓰지 못했습니다.
  • 'MethodName' 허브 메서드를 호출하지 못했습니다.
  • Redis에 연결하지 못했습니다.

SignalR은 서버를 백업할 때 메시지를 보내도록 버퍼링하지 않습니다. Redis 서버를 종료하는 동안 전송된 모든 메시지는 손실됩니다.

SignalR은 Redis 서버를 다시 사용할 수 있게 되면 자동으로 다시 연결합니다.

연결 실패에 대한 사용자 지정 동작

Redis 연결 실패 이벤트를 처리하는 방법을 보여 주는 예제는 다음과 같습니다.

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 클러스터

Redis 클러스터 는 동시에 활성화된 여러 Redis 서버를 활용하여 고가용성을 달성합니다. Redis 클러스터를 백 SignalR플레인으로 사용하는 경우 메시지는 앱을 코드 수정하지 않고 클러스터의 모든 노드에 전달됩니다.

클러스터의 노드 수와 백플레인의 처리량 간에는 절충이 있습니다. 노드 수를 늘리면 클러스터의 가용성이 증가하지만 메시지가 클러스터의 모든 노드로 전송되어야 하므로 처리량이 줄어듭니다.

SignalR 앱에서 다음 방법 중 하나를 사용하여 가능한 모든 Redis 노드를 포함합니다.

  • 쉼표로 구분된 연결 문자열 노드를 나열합니다.
  • 연결 실패에 사용자 지정 동작을 사용하는 경우 노드를 추가합니다 ConfigurationOptions.Endpoints.

다음 단계

자세한 내용은 다음 리소스를 참조하세요.

이 문서에서는 ASP.NET Core SignalR 앱을 스케일 아웃하는 데 사용할 Redis 서버 설정의 SignalR 특정 측면을 설명합니다.

Redis 백플레인 설정

  • Redis 서버를 배포합니다.

    Important

    프로덕션 사용을 위해 Redis 백플레인은 SignalR 앱과 동일한 데이터 센터에서 실행되는 경우에만 권장됩니다. 그렇지 않으면 네트워크 대기 시간이 성능을 저하시킵니다. SignalR 앱이 Azure 클라우드에서 실행되는 경우 Redis 백플레인 대신 Azure SignalR Service를 권장합니다.

    자세한 내용은 다음 리소스를 참조하세요.

  • SignalR 앱에서 다음 NuGet 패키지를 설치합니다.

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Startup.ConfigureServices 메서드에서 AddStackExchangeRedis를 호출합니다.

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    
  • 필요에 따라 옵션을 구성합니다.

    대부분의 옵션은 연결 문자열 또는 개체에서 ConfigurationOptions 설정할 수 있습니다. ConfigurationOptions에 지정된 옵션은 연결 문자열에 설정된 옵션을 재정의합니다.

    다음 예제에서는 ConfigurationOptions 개체의 옵션을 설정하는 방법을 보여 줍니다. 이 예제에서는 다음 단계에 설명된 것처럼 여러 앱이 동일한 Redis 인스턴스를 공유할 수 있도록 채널 접두사를 추가합니다.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    위의 코드에서 options.Configuration은 연결 문자열에 지정된 항목을 사용하여 초기화됩니다.

    Redis 옵션에 대한 자세한 내용은 StackExchange Redis 설명서를 참조하세요.

  • 여러 SignalR 앱에 대해 하나의 Redis 서버를 사용하는 경우 각 SignalR 앱에 대해 다른 채널 접두사를 사용합니다.

    채널 접두사를 설정하면 다른 채널 접두사를 사용하는 다른 앱에서 하나의 SignalR 앱을 격리합니다. 서로 다른 접두사를 할당하지 않으면 한 앱에서 모든 자체 클라이언트로 전송되는 메시지는 Redis 서버를 백플레인으로 사용하는 모든 앱의 모든 클라이언트로 이동합니다.

  • 고정 세션에 대해 서버 팜 부하 분산 소프트웨어를 구성합니다. 이 작업을 수행하는 방법에 대한 설명서의 몇 가지 예제는 다음과 같습니다.

Redis 서버 오류

Redis 서버 작동이 중단되면 SignalR에서 메시지가 전달되지 않음을 나타내는 예외가 throw됩니다. 몇 가지 일반적인 예외 메시지:

  • 메시지를 쓰지 못했습니다.
  • 'MethodName' 허브 메서드를 호출하지 못했습니다.
  • Redis에 연결하지 못했습니다.

SignalR은 서버를 백업할 때 메시지를 보내도록 버퍼링하지 않습니다. Redis 서버를 종료하는 동안 전송된 모든 메시지는 손실됩니다.

SignalR은 Redis 서버를 다시 사용할 수 있게 되면 자동으로 다시 연결합니다.

연결 실패에 대한 사용자 지정 동작

Redis 연결 실패 이벤트를 처리하는 방법을 보여 주는 예제는 다음과 같습니다.

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 클러스터

Redis 클러스터 는 동시에 활성화된 여러 Redis 서버를 활용하여 고가용성을 달성합니다. Redis 클러스터를 백 SignalR플레인으로 사용하는 경우 메시지는 앱을 코드 수정하지 않고 클러스터의 모든 노드에 전달됩니다.

클러스터의 노드 수와 백플레인의 처리량 간에는 절충이 있습니다. 노드 수를 늘리면 클러스터의 가용성이 증가하지만 메시지가 클러스터의 모든 노드로 전송되어야 하므로 처리량이 줄어듭니다.

SignalR 앱에서 다음 방법 중 하나를 사용하여 가능한 모든 Redis 노드를 포함합니다.

  • 쉼표로 구분된 연결 문자열 노드를 나열합니다.
  • 연결 실패에 사용자 지정 동작을 사용하는 경우 노드를 추가합니다 ConfigurationOptions.Endpoints.

다음 단계

자세한 내용은 다음 리소스를 참조하세요.

이 문서에서는 ASP.NET Core SignalR 앱을 스케일 아웃하는 데 사용할 Redis 서버 설정의 SignalR 특정 측면을 설명합니다.

Redis 백플레인 설정

  • Redis 서버를 배포합니다.

    Important

    프로덕션 사용을 위해 Redis 백플레인은 SignalR 앱과 동일한 데이터 센터에서 실행되는 경우에만 권장됩니다. 그렇지 않으면 네트워크 대기 시간이 성능을 저하시킵니다. SignalR 앱이 Azure 클라우드에서 실행되는 경우 Redis 백플레인 대신 Azure SignalR Service를 권장합니다.

    자세한 내용은 다음 리소스를 참조하세요.

  • SignalR 앱에서 다음 NuGet 패키지 중 하나를 설치합니다.

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis - StackExchange.Redis 2.X.X에 따라 다릅니다. 이는 ASP.NET Core 2.2 이상에 권장되는 패키지입니다.
    • Microsoft.AspNetCore.SignalR.Redis - StackExchange.Redis 1.X.X에 따라 다릅니다. 이 패키지는 ASP.NET Core 3.0 이상에 포함되지 않습니다.
  • Startup.ConfigureServices 메서드에서 AddStackExchangeRedis를 호출합니다.

    services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
    

Microsoft.AspNetCore.SignalR.Redis를 사용하는 경우 AddRedis를 호출합니다.

  • 필요에 따라 옵션을 구성합니다.

    대부분의 옵션은 연결 문자열 또는 ConfigurationOptions 개체에서 설정할 수 있습니다. ConfigurationOptions에 지정된 옵션은 연결 문자열에 설정된 옵션을 재정의합니다.

    다음 예제에서는 ConfigurationOptions 개체의 옵션을 설정하는 방법을 보여 줍니다. 이 예제에서는 다음 단계에 설명된 것처럼 여러 앱이 동일한 Redis 인스턴스를 공유할 수 있도록 채널 접두사를 추가합니다.

    services.AddSignalR()
      .AddStackExchangeRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

Microsoft.AspNetCore.SignalR.Redis를 사용하는 경우 AddRedis를 호출합니다.

위의 코드에서 options.Configuration은 연결 문자열에 지정된 항목을 사용하여 초기화됩니다.

Redis 옵션에 대한 자세한 내용은 StackExchange Redis 설명서를 참조하세요.

  • 여러 SignalR 앱에 대해 하나의 Redis 서버를 사용하는 경우 각 SignalR 앱에 대해 다른 채널 접두사를 사용합니다.

    채널 접두사를 설정하면 다른 채널 접두사를 사용하는 다른 앱에서 하나의 SignalR 앱을 격리합니다. 서로 다른 접두사를 할당하지 않으면 한 앱에서 모든 자체 클라이언트로 전송되는 메시지는 Redis 서버를 백플레인으로 사용하는 모든 앱의 모든 클라이언트로 이동합니다.

  • 고정 세션에 대해 서버 팜 부하 분산 소프트웨어를 구성합니다. 이 작업을 수행하는 방법에 대한 설명서의 몇 가지 예제는 다음과 같습니다.

Redis 서버 오류

Redis 서버 작동이 중단되면 SignalR에서 메시지가 전달되지 않음을 나타내는 예외가 throw됩니다. 몇 가지 일반적인 예외 메시지:

  • 메시지를 쓰지 못했습니다.
  • 'MethodName' 허브 메서드를 호출하지 못했습니다.
  • Redis에 연결하지 못했습니다.

SignalR은 서버를 백업할 때 메시지를 보내도록 버퍼링하지 않습니다. Redis 서버를 종료하는 동안 전송된 모든 메시지는 손실됩니다.

SignalR은 Redis 서버를 다시 사용할 수 있게 되면 자동으로 다시 연결합니다.

연결 실패에 대한 사용자 지정 동작

Redis 연결 실패 이벤트를 처리하는 방법을 보여 주는 예제는 다음과 같습니다.

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 클러스터

Redis 클러스터 는 동시에 활성화된 여러 Redis 서버를 활용하여 고가용성을 달성합니다. Redis 클러스터를 백 SignalR플레인으로 사용하는 경우 메시지는 앱을 코드 수정하지 않고 클러스터의 모든 노드에 전달됩니다.

클러스터의 노드 수와 백플레인의 처리량 간에는 절충이 있습니다. 노드 수를 늘리면 클러스터의 가용성이 증가하지만 메시지가 클러스터의 모든 노드로 전송되어야 하므로 처리량이 줄어듭니다.

SignalR 앱에서 다음 방법 중 하나를 사용하여 가능한 모든 Redis 노드를 포함합니다.

  • 쉼표로 구분된 연결 문자열 노드를 나열합니다.
  • 연결 실패에 사용자 지정 동작을 사용하는 경우 노드를 추가합니다 ConfigurationOptions.Endpoints.

다음 단계

자세한 내용은 다음 리소스를 참조하세요.

이 문서에서는 ASP.NET Core SignalR 앱을 스케일 아웃하는 데 사용할 Redis 서버 설정의 SignalR 특정 측면을 설명합니다.

Redis 백플레인 설정

  • Redis 서버를 배포합니다.

    Important

    프로덕션 사용을 위해 Redis 백플레인은 SignalR 앱과 동일한 데이터 센터에서 실행되는 경우에만 권장됩니다. 그렇지 않으면 네트워크 대기 시간이 성능을 저하시킵니다. SignalR 앱이 Azure 클라우드에서 실행되는 경우 Redis 백플레인 대신 Azure SignalR Service를 권장합니다.

    자세한 내용은 다음 리소스를 참조하세요.

  • SignalR 앱에서 Microsoft.AspNetCore.SignalR.Redis NuGet 패키지를 설치합니다.

  • Startup.ConfigureServices 메서드에서 AddSignalR 다음에 AddRedis를 호출합니다.

    services.AddSignalR().AddRedis("<your_Redis_connection_string>");
    
  • 필요에 따라 옵션을 구성합니다.

    대부분의 옵션은 연결 문자열 또는 ConfigurationOptions 개체에서 설정할 수 있습니다. ConfigurationOptions에 지정된 옵션은 연결 문자열에 설정된 옵션을 재정의합니다.

    다음 예제에서는 ConfigurationOptions 개체의 옵션을 설정하는 방법을 보여 줍니다. 이 예제에서는 다음 단계에 설명된 것처럼 여러 앱이 동일한 Redis 인스턴스를 공유할 수 있도록 채널 접두사를 추가합니다.

    services.AddSignalR()
      .AddRedis(connectionString, options => {
          options.Configuration.ChannelPrefix = "MyApp";
      });
    

    위의 코드에서 options.Configuration은 연결 문자열에 지정된 항목을 사용하여 초기화됩니다.

  • 여러 SignalR 앱에 대해 하나의 Redis 서버를 사용하는 경우 각 SignalR 앱에 대해 다른 채널 접두사를 사용합니다.

    채널 접두사를 설정하면 다른 채널 접두사를 사용하는 다른 앱에서 하나의 SignalR 앱을 격리합니다. 서로 다른 접두사를 할당하지 않으면 한 앱에서 모든 자체 클라이언트로 전송되는 메시지는 Redis 서버를 백플레인으로 사용하는 모든 앱의 모든 클라이언트로 이동합니다.

  • 고정 세션에 대해 서버 팜 부하 분산 소프트웨어를 구성합니다. 이 작업을 수행하는 방법에 대한 설명서의 몇 가지 예제는 다음과 같습니다.

Redis 서버 오류

Redis 서버 작동이 중단되면 SignalR에서 메시지가 전달되지 않음을 나타내는 예외가 throw됩니다. 몇 가지 일반적인 예외 메시지:

  • 메시지를 쓰지 못했습니다.
  • 'MethodName' 허브 메서드를 호출하지 못했습니다.
  • Redis에 연결하지 못했습니다.

SignalR은 서버를 백업할 때 메시지를 보내도록 버퍼링하지 않습니다. Redis 서버를 종료하는 동안 전송된 모든 메시지는 손실됩니다.

SignalR은 Redis 서버를 다시 사용할 수 있게 되면 자동으로 다시 연결합니다.

연결 실패에 대한 사용자 지정 동작

Redis 연결 실패 이벤트를 처리하는 방법을 보여 주는 예제는 다음과 같습니다.

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

Redis 클러스터

Redis 클러스터 는 동시에 활성화된 여러 Redis 서버를 활용하여 고가용성을 달성합니다. Redis 클러스터를 백 SignalR플레인으로 사용하는 경우 메시지는 앱을 코드 수정하지 않고 클러스터의 모든 노드에 전달됩니다.

클러스터의 노드 수와 백플레인의 처리량 간에는 절충이 있습니다. 노드 수를 늘리면 클러스터의 가용성이 증가하지만 메시지가 클러스터의 모든 노드로 전송되어야 하므로 처리량이 줄어듭니다.

SignalR 앱에서 다음 방법 중 하나를 사용하여 가능한 모든 Redis 노드를 포함합니다.

  • 쉼표로 구분된 연결 문자열 노드를 나열합니다.
  • 연결 실패에 사용자 지정 동작을 사용하는 경우 노드를 추가합니다 ConfigurationOptions.Endpoints.

다음 단계

자세한 내용은 다음 리소스를 참조하세요.