SQL Server による SignalR スケールアウト (SignalR 1.x)
作成者: Patrick Fletcher
警告
このドキュメントは、最新版の SignalR を対象としていません。 ASP.NET Core SignalR に関する記事を参照してください。
このチュートリアルでは、SQL Server を使用して、2 つの個別の IIS インスタンスにデプロイされている SignalR アプリケーション全体にメッセージを分散します。 このチュートリアルは 1 台のテスト マシンで実行することもできますが、最大限の効果を得るには、SignalR アプリケーションを 2 台以上のサーバーにデプロイする必要があります。 また、いずれかのサーバーまたは別の専用サーバーに SQL Server をインストールする必要があります。 もう 1 つの選択肢は、Azure 上の VM を使用してチュートリアルを実行することです。
前提条件
Microsoft SQL Server 2005 以降。 バックプレーンは、SQL Server のデスクトップとサーバーの両方のエディションをサポートします。 SQL Server Compact Edition や Azure SQL Database はサポートされていません。 (アプリケーションが Azure でホストされている場合は、代わりに Service Bus バックプレーンを検討してください)。
概要
詳細なチュートリアルに進む前に、これから行うことの概要を簡単に説明します。
新しく空のデータベースを作成します。 バックプレーンによって、このデータベースに必要なテーブルが作成されます。
次の NuGet パッケージをアプリケーションに追加します。
SignalR アプリケーションを作成します。
次のコードを Global.asax に追加して、バックプレーンを構成します。
protected void Application_Start() { string sqlConnectionString = "Connecton string to your SQL DB"; GlobalHost.DependencyResolver.UseSqlServer(sqlConnectionString); RouteTable.Routes.MapHubs(); // ... }
データベースを構成する
アプリケーションが Windows 認証と SQL Server 認証のどちらを使用してデータベースにアクセスするかを決定します。 どちらの場合も、データベース ユーザーにログイン、スキーマ作成、テーブル作成のアクセス許可があることを確認します。
バックプレーンが使用する新しいデータベースを作成します。 データベースには任意の名前を付けることができます。 データベースにテーブルを作成する必要はありません。バックプレーンにより必要なテーブルが作成されます。
Service Broker を有効にする
バックプレーン データベースに対して Service Broker を有効にすることをお勧めします。 Service Broker は、SQL Server でのメッセージングとキューイングのネイティブ サポートを提供し、バックプレーンがより効率的に更新プログラムを受信できるようにします。 (ただし、バックプレーンは Service Broker なしでも機能します)。
Service Broker が有効になっているかどうかを確認するために、sys.databases カタログ ビューの is_broker_enabled 列に対してクエリを実行します。
SELECT [name], [service_broker_guid], [is_broker_enabled]
FROM [master].[sys].[databases]
Service Broker を有効にするには、次の SQL クエリを使用します。
ALTER DATABASE YOUR_DATABASE SET ENABLE_BROKER
Note
このクエリがデッドロックしているように見える場合は、DB に接続されているアプリケーションがないことを確認します。
トレースを有効にしている場合、トレースには Service Broker が有効かどうかも表示されます。
SignalR アプリケーションを作成する
次のいずれかのチュートリアルに従って SignalR アプリケーションを作成します。
次に、SQL Server でのスケールアウトをサポートするようにチャット アプリケーションを変更します。 まず、SignalR.SqlServer NuGet パッケージをプロジェクトに追加します。 Visual Studio の [ツール] メニューで、[NuGet パッケージ マネージャー]を選択し、[パッケージ マネージャー コンソール] を選択します。 [パッケージ マネージャー コンソール] ウィンドウで、次のコマンドを入力します。
Install-Package Microsoft.AspNet.SignalR.SqlServer
次に、Global.asax ファイルを開きます。 次のコードを Application_Start メソッドに追加します。
protected void Application_Start()
{
string sqlConnectionString = "<add your SQL connection string here>";
GlobalHost.DependencyResolver.UseSqlServer(sqlConnectionString);
RouteTable.Routes.MapHubs();
}
アプリケーションのデプロイと実行
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 ロールを追加したときに管理サービスがインストールされていることを確認してください。)
最後に、TCP のポート 8172 を開きます。 これは、Web 配置ツールが使用するポートです。
これで、開発用コンピューターからサーバーに Visual Studio プロジェクトをデプロイする準備ができました。 ソリューション エクスプローラーで、ソリューションを右クリックし、[発行] をクリックします。
Web 配置の詳細なドキュメントについては、Visual Studio および ASP.NET の Web 配置コンテンツ マップに関するページを参照してください。
アプリケーションを 2 台のサーバーにデプロイする場合は、個別のブラウザー ウィンドウで各インスタンスを開き、それぞれがもう一方から SignalR メッセージを受信することを確認できます。 (もちろん、運用環境では、2 台のサーバーはロード バランサーの背後に配置されます。)
アプリケーションを実行すると、SignalR によってデータベースにテーブルが自動的に作成されていることがわかります。
SignalR により管理が管理されます。 アプリケーションがデプロイされている限り、行の削除やテーブルの変更などを行わないでください。