Redis による SignalR スケールアウト

警告

このドキュメントは、最新版の SignalR に対するものではありません。 ASP.NET Core SignalR を参照してください。

このトピックで使用されるソフトウェアのバージョン

このトピックの以前のバージョン

SignalR の以前のバージョンの詳細については、「SignalR の以前のバージョン」を参照してください。

質問とコメント

このチュートリアルの感想、改善に関するフィードバックをページの下部にあるコメント欄にお寄せください。 チュートリアルに直接関連しない質問がある場合は、ASP.NET SignalR フォーラムまたは StackOverflow.com に投稿できます。

このチュートリアルでは、Redis を使用して、2 つの個別の IIS インスタンスにデプロイされた SignalR アプリケーション全体にメッセージを配布します。

Redis は、メモリ内のキー値ストアです。 また、パブリッシュ/サブスクライブ モデルを使用したメッセージング システムもサポートしています。 SignalR Redis バックプレーンでは、pub/sub 機能を使用して、メッセージを他のサーバーに転送します。

Diagram that shows arrows going from Redis Server to V M and then to computers. One arrow labeled Publish goes from V M to Redis Server.

このチュートリアルでは、次の 3 台のサーバーを使用します。

  • Windows を実行する 2 台のサーバー。SignalR アプリケーションのデプロイに使用します。
  • Linux を実行する 1 台のサーバー。Redis の実行に使用します。 このチュートリアルのスクリーンショットでは、Ubuntu 12.04 TLS を使用しました。

使用する物理サーバーが 3 台ない場合は、Hyper-V 上に VM を作成できます。 もう 1 つのオプションは、Azure に VM を作成することです。

このチュートリアルでは、公式の Redis 実装を使用しますが、MSOpenTech からの Redis の Windows ポートもあります。 設定と構成は異なりますが、それ以外の場合は手順は同じです。

Note

Redis を使用した SignalR スケールアウトでは、Redis クラスターはサポートされていません。

概要

詳細なチュートリアルに進む前に、これから行うことの概要を簡単に説明します。

  1. Redis をインストールし、Redis サーバーを起動します。

  2. 次の NuGet パッケージをアプリケーションに追加します。

  3. SignalR アプリケーションを作成します。

  4. 次のコードを Startup.cs に追加して、バックプレーンを構成します。

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            GlobalHost.DependencyResolver.UseStackExchangeRedis("server", port, "password", "AppName");
            app.MapSignalR();
        }
    }
    

Hyper-V 上の Ubuntu

Windows Hyper-V を使用すると、Windows Server 上に Ubuntu VM を簡単に作成できます。

http://www.ubuntu.com から Ubuntu ISO をダウンロードします。

Hyper-V で、新しい VM を追加します。 [仮想ハード ディスクの接続] ステップで、[仮想ハード ディスクの作成] を選択します。

Screenshot that shows the New Virtual Machine Wizard dialog box. Connect Virtual Hard Disk and Create a virtual hard disk are selected.

[インストールオプション] ステップで、[イメージ ファイル (.iso)] を選択し、[参照] をクリックして、Ubuntu インストール ISO を参照します。

Screenshot that shows the New Virtual Machine Wizard on the Installation Options page. Install an O S from a boot C D D V D ROM and Image file dot i s o are selected.

Redis をインストールする

http://redis.io/download の手順に従って、Redis をダウンロードしてビルドします。

wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz
tar xzf redis-2.6.12.tar.gz
cd redis-2.6.12
make

これにより、src ディレクトリ内に Redis バイナリがビルドされます。

既定では、Redis にはパスワードは必要ありません。 パスワードを設定するには、ソース コードのルート ディレクトリにある redis.conf ファイルを編集します。 (編集する前に、ファイルのバックアップ コピーを作成してください)次のディレクティブを redis.conf に追加します。

requirepass YourStrongPassword1234

ここで、Redis サーバーを起動します。

src/redis-server redis.conf

Screenshot that shows the main page of the Redis server.

Redis がリッスンする既定のポートであるポート 6379 を開きます。 (構成ファイルでポート番号を変更できます。)

SignalR アプリケーションを作成する

次のいずれかのチュートリアルに従って SignalR アプリケーションを作成します。

次に、Redis でのスケールアウトをサポートするようにチャット アプリケーションを変更します。 まず、Microsoft.AspNet.SignalR.StackExchangeRedis NuGet パッケージをプロジェクトに追加します。 Visual Studio の [ツール] メニューで、[NuGet パッケージ マネージャー]を選択し、[パッケージ マネージャー コンソール] を選択します。 [パッケージ マネージャー コンソール] ウィンドウで、次のコマンドを入力します。

Install-Package Microsoft.AspNet.SignalR.StackExchangeRedis

次に、Startup.cs ファイルを開きます。 Configuration メソッドに次のコードを追加します。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Any connection or hub wire up and configuration should go here
        GlobalHost.DependencyResolver.UseStackExchangeRedis("server", port, "password", "AppName");
        app.MapSignalR();
    }
}
  • "server" は、Redis を実行しているサーバーの名前です。
  • port はポート番号です。
  • "password" は redis.conf ファイルで定義したパスワードです。
  • "AppName" は任意の文字列です。 SignalR は、この名前を使用して Redis pub/sub チャネルを作成します。

次に例を示します。

GlobalHost.DependencyResolver.UseStackExchangeRedis("redis-server.cloudapp.net", 6379,
    "MyStrongPassword1234", "ChatApp");

アプリケーションのデプロイと実行

SignalR アプリケーションをデプロイするための Windows Server インスタンスを準備します。

IIS ロールを追加します。 WebSocket プロトコルを含む "アプリケーション開発" 機能を含めます。

Screenshot that shows Add Roles and Features Wizard. Server Roles and WebSocket Protocol are selected.

管理サービスも含めます ([管理ツール] の下に表示されます)。

Screenshot that shows Add Roles and Features Wizard. Management Service is selected.

Web Deploy 3.0 をインストールします。 IIS マネージャーを実行すると、Microsoft Web Platform をインストールするよう求めるメッセージが表示されるか、インストーラーをダウンロードできます。 Platform Installer で、Web Deploy を検索し、Web Deploy 3.0 をインストールします

Screenshot that shows Web Platform Installer 4 point 5 dialog box. Web Deploy 3 point 0 is selected.

Web 管理サービスが実行されていることを確認します。 そうでない場合は、サービスを開始します。 (Windows サービスの一覧に Web 管理サービスが表示されない場合は、IIS ロールを追加したときに管理サービスがインストールされていることを確認してください。)

既定では、Web 管理サービスは TCP ポート 8172 でリッスンします。 Windows ファイアウォールで、ポート 8172 で TCP トラフィックを許可する新しい受信規則を作成します。 詳細については、「ファイアウォール規則の構成」を参照してください。 (Azure で VM をホストしている場合は、Azure portal で直接これを行うことができます。「仮想マシンにエンドポイントを設定する方法」を参照してください。)

これで、開発用コンピューターからサーバーに Visual Studio プロジェクトをデプロイする準備ができました。 ソリューション エクスプローラーで、ソリューションを右クリックし、[発行] をクリックします。

Web 配置の詳細なドキュメントについては、Visual Studio および ASP.NET の Web 配置コンテンツ マップに関するページを参照してください。

アプリケーションを 2 台のサーバーにデプロイする場合は、個別のブラウザー ウィンドウで各インスタンスを開き、それぞれがもう一方から SignalR メッセージを受信することを確認できます。 (もちろん、運用環境では、2 台のサーバーはロード バランサーの背後に配置されます。)

Screenshot of two browser windows open showing the application deployed to two servers.

Redis に送信されるメッセージを確認したい場合は、Redis と共にインストールされる redis-cli クライアントを使用できます。

redis-cli -a password
SUBSCRIBE ChatApp

Screenshot that shows a numbered list in a Redis window.