Redis による SignalR スケールアウト
警告
このドキュメントは、最新版の SignalR に対するものではありません。 ASP.NET Core SignalR を参照してください。
このトピックで使用されるソフトウェアのバージョン
- Visual Studio 2013
- .NET 4.5
- SignalR バージョン 2.4
このトピックの以前のバージョン
SignalR の以前のバージョンの詳細については、「SignalR の以前のバージョン」を参照してください。
質問とコメント
このチュートリアルの感想、改善に関するフィードバックをページの下部にあるコメント欄にお寄せください。 チュートリアルに直接関連しない質問がある場合は、ASP.NET SignalR フォーラムまたは StackOverflow.com に投稿できます。
このチュートリアルでは、Redis を使用して、2 つの個別の IIS インスタンスにデプロイされた SignalR アプリケーション全体にメッセージを配布します。
Redis は、メモリ内のキー値ストアです。 また、パブリッシュ/サブスクライブ モデルを使用したメッセージング システムもサポートしています。 SignalR Redis バックプレーンでは、pub/sub 機能を使用して、メッセージを他のサーバーに転送します。
このチュートリアルでは、次の 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 クラスターはサポートされていません。
概要
詳細なチュートリアルに進む前に、これから行うことの概要を簡単に説明します。
Redis をインストールし、Redis サーバーを起動します。
次の NuGet パッケージをアプリケーションに追加します。
SignalR アプリケーションを作成します。
次のコードを 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 を追加します。 [仮想ハード ディスクの接続] ステップで、[仮想ハード ディスクの作成] を選択します。
[インストールオプション] ステップで、[イメージ ファイル (.iso)] を選択し、[参照] をクリックして、Ubuntu インストール ISO を参照します。
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
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 プロトコルを含む "アプリケーション開発" 機能を含めます。
管理サービスも含めます ([管理ツール] の下に表示されます)。
Web Deploy 3.0 をインストールします。 IIS マネージャーを実行すると、Microsoft Web Platform をインストールするよう求めるメッセージが表示されるか、インストーラーをダウンロードできます。 Platform Installer で、Web Deploy を検索し、Web Deploy 3.0 をインストールします
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 台のサーバーはロード バランサーの背後に配置されます。)
Redis に送信されるメッセージを確認したい場合は、Redis と共にインストールされる redis-cli クライアントを使用できます。
redis-cli -a password
SUBSCRIBE ChatApp