ASP.NET Core SignalR のスケールアウトのために Redis バックプレーンを設定する

作成者: Andrew Stanton-NurseBrady GasterTom Dykstra

この記事では、ASP.NET Core SignalR アプリのスケールアウトに使う Redis サーバーの設定について SignalR 固有の側面から説明します。

警告

この記事では、接続文字列の使用方法について説明します。 ローカル データベースでは、ユーザーを認証する必要はありませんが、運用環境では、接続文字列認証用のパスワードが含まれる場合があります。 リソース所有者パスワード資格情報 (ROPC) は、運用データベースで回避する必要があるセキュリティ リスクです。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 テスト環境または運用環境にデプロイされたアプリの認証の詳細については、「 安全な認証フロー」を参照してください。

Redis バックプレーンを設定する

  • Redis サーバーをデプロイします。

    重要

    運用環境で使う場合、SignalR アプリと同じデータ センターで実行する場合にのみ、Redis バックプレーンをお勧めします。 それ以外の場合、ネットワークの待機時間により、パフォーマンスは低下します。 SignalR アプリが Azure クラウドで実行されている場合は、Redis バックプレーンではなく Azure SignalR サービスをお勧めします。

    詳細については、次のリソースを参照してください。

  • SignalR アプリで、次の NuGet パッケージをインストールします。

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Program.cs ファイルで builder.Build()) を呼び出す行の前に次の行を追加して、AddStackExchangeRedis を呼び出します。

    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 アプリに対して 1 つの Redis サーバーを使っている場合は、SignalR アプリごとに異なるチャネル プレフィックスを使います。

    チャネル プレフィックスを設定することで、1 つの SignalR アプリを、異なるチャネル プレフィックスを使う他のアプリから分離します。 異なるプレフィックスを割り当てないと、あるアプリからそのアプリのすべてのクライアントに送信されたメッセージは、Redis サーバーをバックプレーンとして使っているすべてのアプリのすべてのクライアントに送信されます。

  • サーバー ファームの負荷分散ソフトウェアを固定セッション用に構成します。 その方法についてのドキュメントの例をいくつか示します。

Redis サーバーのエラー

Redis サーバーがダウンすると、SignalR からメッセージが配信されないことを示す例外がスローされます。 一般的な例外メッセージの一部を次に示します。

  • メッセージの書き込みに失敗しました
  • ハブ メソッド 'MethodName' の呼び出しに失敗しました
  • Redis への接続に失敗しました

SignalR は、サーバーが復旧したときにメッセージを送信するためのバッファリングを行いません。 Redis サーバーがダウンしている間に送信されたすべてのメッセージは失われます。

Redis サーバーが再び使用可能になると、SignalR によって自動的に再接続されます。

接続エラーに対するカスタム動作

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 固有の側面から説明します。

警告

この記事では、接続文字列の使用方法について説明します。 ローカル データベースでは、ユーザーを認証する必要はありませんが、運用環境では、接続文字列認証用のパスワードが含まれる場合があります。 リソース所有者パスワード資格情報 (ROPC) は、運用データベースで回避する必要があるセキュリティ リスクです。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 テスト環境または運用環境にデプロイされたアプリの認証の詳細については、「 安全な認証フロー」を参照してください。

Redis バックプレーンを設定する

  • Redis サーバーをデプロイします。

    重要

    運用環境で使う場合、SignalR アプリと同じデータ センターで実行する場合にのみ、Redis バックプレーンをお勧めします。 それ以外の場合、ネットワークの待機時間により、パフォーマンスは低下します。 SignalR アプリが Azure クラウドで実行されている場合は、Redis バックプレーンではなく Azure SignalR サービスをお勧めします。

    詳細については、次のリソースを参照してください。

  • SignalR アプリで、次の NuGet パッケージをインストールします。

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Program.cs ファイルで builder.Build()) を呼び出す行の前に次の行を追加して、AddStackExchangeRedis を呼び出します。

    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 アプリに対して 1 つの Redis サーバーを使っている場合は、SignalR アプリごとに異なるチャネル プレフィックスを使います。

    チャネル プレフィックスを設定することで、1 つの SignalR アプリを、異なるチャネル プレフィックスを使う他のアプリから分離します。 異なるプレフィックスを割り当てないと、あるアプリからそのアプリのすべてのクライアントに送信されたメッセージは、Redis サーバーをバックプレーンとして使っているすべてのアプリのすべてのクライアントに送信されます。

  • サーバー ファームの負荷分散ソフトウェアを固定セッション用に構成します。 その方法についてのドキュメントの例をいくつか示します。

Redis サーバーのエラー

Redis サーバーがダウンすると、SignalR からメッセージが配信されないことを示す例外がスローされます。 一般的な例外メッセージの一部を次に示します。

  • メッセージの書き込みに失敗しました
  • ハブ メソッド 'MethodName' の呼び出しに失敗しました
  • Redis への接続に失敗しました

SignalR は、サーバーが復旧したときにメッセージを送信するためのバッファリングを行いません。 Redis サーバーがダウンしている間に送信されたすべてのメッセージは失われます。

Redis サーバーが再び使用可能になると、SignalR によって自動的に再接続されます。

接続エラーに対するカスタム動作

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 固有の側面から説明します。

警告

この記事では、接続文字列の使用方法について説明します。 ローカル データベースでは、ユーザーを認証する必要はありませんが、運用環境では、接続文字列認証用のパスワードが含まれる場合があります。 リソース所有者パスワード資格情報 (ROPC) は、運用データベースで回避する必要があるセキュリティ リスクです。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 テスト環境または運用環境にデプロイされたアプリの認証の詳細については、「 安全な認証フロー」を参照してください。

Redis バックプレーンを設定する

  • Redis サーバーをデプロイします。

    重要

    運用環境で使う場合、SignalR アプリと同じデータ センターで実行する場合にのみ、Redis バックプレーンをお勧めします。 それ以外の場合、ネットワークの待機時間により、パフォーマンスは低下します。 SignalR アプリが Azure クラウドで実行されている場合は、Redis バックプレーンではなく Azure SignalR サービスをお勧めします。

    詳細については、次のリソースを参照してください。

  • SignalR アプリで、次の NuGet パッケージをインストールします。

    • Microsoft.AspNetCore.SignalR.StackExchangeRedis
  • Program.cs ファイルで builder.Build()) を呼び出す行の前に次の行を追加して、AddStackExchangeRedis を呼び出します。

    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 アプリに対して 1 つの Redis サーバーを使っている場合は、SignalR アプリごとに異なるチャネル プレフィックスを使います。

    チャネル プレフィックスを設定することで、1 つの SignalR アプリを、異なるチャネル プレフィックスを使う他のアプリから分離します。 異なるプレフィックスを割り当てないと、あるアプリからそのアプリのすべてのクライアントに送信されたメッセージは、Redis サーバーをバックプレーンとして使っているすべてのアプリのすべてのクライアントに送信されます。

  • サーバー ファームの負荷分散ソフトウェアを固定セッション用に構成します。 その方法についてのドキュメントの例をいくつか示します。

Redis サーバーのエラー

Redis サーバーがダウンすると、SignalR からメッセージが配信されないことを示す例外がスローされます。 一般的な例外メッセージの一部を次に示します。

  • メッセージの書き込みに失敗しました
  • ハブ メソッド 'MethodName' の呼び出しに失敗しました
  • Redis への接続に失敗しました

SignalR は、サーバーが復旧したときにメッセージを送信するためのバッファリングを行いません。 Redis サーバーがダウンしている間に送信されたすべてのメッセージは失われます。

Redis サーバーが再び使用可能になると、SignalR によって自動的に再接続されます。

接続エラーに対するカスタム動作

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 固有の側面から説明します。

警告

この記事では、接続文字列の使用方法について説明します。 ローカル データベースでは、ユーザーを認証する必要はありませんが、運用環境では、接続文字列認証用のパスワードが含まれる場合があります。 リソース所有者パスワード資格情報 (ROPC) は、運用データベースで回避する必要があるセキュリティ リスクです。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 テスト環境または運用環境にデプロイされたアプリの認証の詳細については、「 安全な認証フロー」を参照してください。

Redis バックプレーンを設定する

  • Redis サーバーをデプロイします。

    重要

    運用環境で使う場合、SignalR アプリと同じデータ センターで実行する場合にのみ、Redis バックプレーンをお勧めします。 それ以外の場合、ネットワークの待機時間により、パフォーマンスは低下します。 SignalR アプリが Azure クラウドで実行されている場合は、Redis バックプレーンではなく Azure SignalR サービスをお勧めします。

    詳細については、次のリソースを参照してください。

  • 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 アプリに対して 1 つの Redis サーバーを使っている場合は、SignalR アプリごとに異なるチャネル プレフィックスを使います。

    チャネル プレフィックスを設定することで、1 つの SignalR アプリを、異なるチャネル プレフィックスを使う他のアプリから分離します。 異なるプレフィックスを割り当てないと、あるアプリからそのアプリのすべてのクライアントに送信されたメッセージは、Redis サーバーをバックプレーンとして使っているすべてのアプリのすべてのクライアントに送信されます。

  • サーバー ファームの負荷分散ソフトウェアを固定セッション用に構成します。 その方法についてのドキュメントの例をいくつか示します。

Redis サーバーのエラー

Redis サーバーがダウンすると、SignalR からメッセージが配信されないことを示す例外がスローされます。 一般的な例外メッセージの一部を次に示します。

  • メッセージの書き込みに失敗しました
  • ハブ メソッド 'MethodName' の呼び出しに失敗しました
  • Redis への接続に失敗しました

SignalR は、サーバーが復旧したときにメッセージを送信するためのバッファリングを行いません。 Redis サーバーがダウンしている間に送信されたすべてのメッセージは失われます。

Redis サーバーが再び使用可能になると、SignalR によって自動的に再接続されます。

接続エラーに対するカスタム動作

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 固有の側面から説明します。

警告

この記事では、接続文字列の使用方法について説明します。 ローカル データベースでは、ユーザーを認証する必要はありませんが、運用環境では、接続文字列認証用のパスワードが含まれる場合があります。 リソース所有者パスワード資格情報 (ROPC) は、運用データベースで回避する必要があるセキュリティ リスクです。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 テスト環境または運用環境にデプロイされたアプリの認証の詳細については、「 安全な認証フロー」を参照してください。

Redis バックプレーンを設定する

  • Redis サーバーをデプロイします。

    重要

    運用環境で使う場合、SignalR アプリと同じデータ センターで実行する場合にのみ、Redis バックプレーンをお勧めします。 それ以外の場合、ネットワークの待機時間により、パフォーマンスは低下します。 SignalR アプリが Azure クラウドで実行されている場合は、Redis バックプレーンではなく Azure SignalR サービスをお勧めします。

    詳細については、次のリソースを参照してください。

  • 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 アプリに対して 1 つの Redis サーバーを使っている場合は、SignalR アプリごとに異なるチャネル プレフィックスを使います。

    チャネル プレフィックスを設定することで、1 つの SignalR アプリを、異なるチャネル プレフィックスを使う他のアプリから分離します。 異なるプレフィックスを割り当てないと、あるアプリからそのアプリのすべてのクライアントに送信されたメッセージは、Redis サーバーをバックプレーンとして使っているすべてのアプリのすべてのクライアントに送信されます。

  • サーバー ファームの負荷分散ソフトウェアを固定セッション用に構成します。 その方法についてのドキュメントの例をいくつか示します。

Redis サーバーのエラー

Redis サーバーがダウンすると、SignalR からメッセージが配信されないことを示す例外がスローされます。 一般的な例外メッセージの一部を次に示します。

  • メッセージの書き込みに失敗しました
  • ハブ メソッド 'MethodName' の呼び出しに失敗しました
  • Redis への接続に失敗しました

SignalR は、サーバーが復旧したときにメッセージを送信するためのバッファリングを行いません。 Redis サーバーがダウンしている間に送信されたすべてのメッセージは失われます。

Redis サーバーが再び使用可能になると、SignalR によって自動的に再接続されます。

接続エラーに対するカスタム動作

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 固有の側面から説明します。

警告

この記事では、接続文字列の使用方法について説明します。 ローカル データベースでは、ユーザーを認証する必要はありませんが、運用環境では、接続文字列認証用のパスワードが含まれる場合があります。 リソース所有者パスワード資格情報 (ROPC) は、運用データベースで回避する必要があるセキュリティ リスクです。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 テスト環境または運用環境にデプロイされたアプリの認証の詳細については、「 安全な認証フロー」を参照してください。

Redis バックプレーンを設定する

  • Redis サーバーをデプロイします。

    重要

    運用環境で使う場合、SignalR アプリと同じデータ センターで実行する場合にのみ、Redis バックプレーンをお勧めします。 それ以外の場合、ネットワークの待機時間により、パフォーマンスは低下します。 SignalR アプリが Azure クラウドで実行されている場合は、Redis バックプレーンではなく Azure SignalR サービスをお勧めします。

    詳細については、次のリソースを参照してください。

  • 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 アプリに対して 1 つの Redis サーバーを使っている場合は、SignalR アプリごとに異なるチャネル プレフィックスを使います。

    チャネル プレフィックスを設定することで、1 つの SignalR アプリを、異なるチャネル プレフィックスを使う他のアプリから分離します。 異なるプレフィックスを割り当てないと、あるアプリからそのアプリのすべてのクライアントに送信されたメッセージは、Redis サーバーをバックプレーンとして使っているすべてのアプリのすべてのクライアントに送信されます。

  • サーバー ファームの負荷分散ソフトウェアを固定セッション用に構成します。 その方法についてのドキュメントの例をいくつか示します。

Redis サーバーのエラー

Redis サーバーがダウンすると、SignalR からメッセージが配信されないことを示す例外がスローされます。 一般的な例外メッセージの一部を次に示します。

  • メッセージの書き込みに失敗しました
  • ハブ メソッド 'MethodName' の呼び出しに失敗しました
  • Redis への接続に失敗しました

SignalR は、サーバーが復旧したときにメッセージを送信するためのバッファリングを行いません。 Redis サーバーがダウンしている間に送信されたすべてのメッセージは失われます。

Redis サーバーが再び使用可能になると、SignalR によって自動的に再接続されます。

接続エラーに対するカスタム動作

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 固有の側面から説明します。

警告

この記事では、接続文字列の使用方法について説明します。 ローカル データベースでは、ユーザーを認証する必要はありませんが、運用環境では、接続文字列認証用のパスワードが含まれる場合があります。 リソース所有者パスワード資格情報 (ROPC) は、運用データベースで回避する必要があるセキュリティ リスクです。 運用アプリでは、使用可能な最も安全な認証フローを使用する必要があります。 テスト環境または運用環境にデプロイされたアプリの認証の詳細については、「 安全な認証フロー」を参照してください。

Redis バックプレーンを設定する

  • Redis サーバーをデプロイします。

    重要

    運用環境で使う場合、SignalR アプリと同じデータ センターで実行する場合にのみ、Redis バックプレーンをお勧めします。 それ以外の場合、ネットワークの待機時間により、パフォーマンスは低下します。 SignalR アプリが Azure クラウドで実行されている場合は、Redis バックプレーンではなく Azure SignalR サービスをお勧めします。

    詳細については、次のリソースを参照してください。

  • 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 アプリに対して 1 つの Redis サーバーを使っている場合は、SignalR アプリごとに異なるチャネル プレフィックスを使います。

    チャネル プレフィックスを設定することで、1 つの SignalR アプリを、異なるチャネル プレフィックスを使う他のアプリから分離します。 異なるプレフィックスを割り当てないと、あるアプリからそのアプリのすべてのクライアントに送信されたメッセージは、Redis サーバーをバックプレーンとして使っているすべてのアプリのすべてのクライアントに送信されます。

  • サーバー ファームの負荷分散ソフトウェアを固定セッション用に構成します。 その方法についてのドキュメントの例をいくつか示します。

Redis サーバーのエラー

Redis サーバーがダウンすると、SignalR からメッセージが配信されないことを示す例外がスローされます。 一般的な例外メッセージの一部を次に示します。

  • メッセージの書き込みに失敗しました
  • ハブ メソッド 'MethodName' の呼び出しに失敗しました
  • Redis への接続に失敗しました

SignalR は、サーバーが復旧したときにメッセージを送信するためのバッファリングを行いません。 Redis サーバーがダウンしている間に送信されたすべてのメッセージは失われます。

Redis サーバーが再び使用可能になると、SignalR によって自動的に再接続されます。

接続エラーに対するカスタム動作

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 に追加します。

次のステップ

詳細については、次のリソースを参照してください。