Redis による SignalR スケールアウト (SignalR 1.x)

作成者: Patrick Fletcher

警告

このドキュメントは、最新版の SignalR を対象としていません。 ASP.NET Core SignalR に関する記事を参照してください。

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

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

Diagram that illustrates the relationship between Redis Server, which subscribes to V Ms, computers, which then publish V Ms onto Redis Servers.

このチュートリアルでは、次の 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. 次のコードを Global.asax に追加して、バックプレーンを構成します。

    protected void Application_Start()
    {
        GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
    
        RouteTable.Routes.MapHubs();
        // ...
    }
    

Hyper-V 上の Ubuntu

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

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

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

Screenshot of the New Virtual Machine Wizard showing the Connect Virtual Hard Disk pane and Name field being highlighted.

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

Screenshot of the New Virtual Machine Wizard with the Installation Options pane and the Image File option being highlighted.

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 of Azure User Redis server window, showing server information including when the server was started and the memory status.

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

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

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

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

Install-Package Microsoft.AspNet.SignalR.Redis

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

protected void Application_Start()
{
    GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");

    RouteTable.Routes.MapHubs();
}
  • "server" は、Redis を実行しているサーバーの名前です。
  • port はポート番号です。
  • "password" は redis.conf ファイルで定義したパスワードです。
  • "AppName" は任意の文字列です。 SignalR は、この名前を使用して Redis pub/sub チャネルを作成します。

次に例を示します。

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

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

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

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

Screenshot of the Add Roles and Features Wizard with the Server Roles and Web Socket Protocol options being highlighted.

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

Screenshot of the Add Roles and Features Wizard with the Server Roles and I I S Management Scripts and Tools options being highlighted.

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

Screenshot of the Web Platform Installer 4 point 5 search results screen with the Web Deploy 3 point 0 option being highlighted.

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 the Signal R messages being displayed in an Internet Explorer web browser, displaying the Index screen.

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

redis-cli -a password
SUBSCRIBE ChatApp

Screenshot of the Azure User output screen, which displays the information for all sent messages and accompanied code.