次の方法で共有


Azure Service Bus による SignalR スケールアウト

作成者: Patrick Fletcher

警告

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

このチュートリアルでは、Service Bus バックプレーンを使ってメッセージを各ロール インスタンスに配信し、SignalR アプリケーションを Windows Azure Web ロールにデプロイします (Azure App Service の Web アプリで Service Bus バックプレーンを使うこともできます)。

Diagram that shows arrows from Topic to Web Roles to computers. An arrow labeled publish starts at Web Roles and goes to Topic.

前提条件:

  • Windows Azure アカウント。
  • Windows Azure SDK
  • Visual Studio 2012 または 2013。

サービス バス バックプレーンは、Service Bus for Windows Server バージョン 1.1 とも互換性があります。 ただし、Service Bus for Windows Server のバージョン 1.0 とは互換性がありません。

価格

Service Bus バックプレーンは、トピックを使ってメッセージを送信します。 最新の価格情報については、Service Bus のページを参照してください。 この記事の執筆時点では、毎月 1,000,000 件のメッセージを 1 ドル未満で送信できます。 バックプレーンは、SignalR ハブ メソッドが呼び出されるたびにサービス バス メッセージを送信します。 接続、切断、グループの参加または脱退などのための制御メッセージもいくつかあります。 ほとんどのアプリケーションでは、メッセージ トラフィックの大部分はハブ メソッドの呼び出しです。

概要

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

  1. Windows Azure portal を使って、新しい Service Bus 名前空間を作成します。

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

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

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

    public void Configuration(IAppBuilder app)
    {
        string connectionString = "Service Bus connection string";
        GlobalHost.DependencyResolver.UseServiceBus(connectionString, "YourAppName");
    
        app.MapSignalR();
        // ...
    }
    

このコードで、TopicCountMaxQueueLength の既定値を使ってバックプレーンを構成します。 これらの値の変更については、「SignalR パフォーマンス」: 「スケールアウト メトリック」を参照してください。

アプリケーションごとに、"YourAppName" に異なる値を選びます。 複数のアプリケーションで同じ値を使わないでください。

Azure サービスを作成する

クラウド サービスを作成してデプロイする方法に関する記事の説明に従って、クラウド サービスを作成します。 「方法: 簡易作成を使ってクラウド サービスを作成する」セクションの手順に従います。 このチュートリアルでは、証明書をアップロードする必要はありません。

Screenshot of the option Cloud Service circled in red.

Service Bus のトピックとサブスクリプションの使用方法に関する記事の説明に従って、新しい Service Bus 名前空間を作成します。 「サービス名前空間を作成する」セクションの手順に従います。

Screenshot of window titled add a new namespace with options below.

Note

クラウド サービスと Service Bus 名前空間には必ず同じリージョンを選びます。

Visual Studio プロジェクトを作成する

Visual Studio を起動します。 [ファイル] メニューの [新しいプロジェクト] をクリックします。

[新しいプロジェクト] ダイアログ ボックスで、[Visual C#] を展開します。 [インストールされているテンプレート] で、[クラウド] を選び、次に [Windows Azure クラウド サービス] を選びます。 既定の [.NET Framework 4.5] をそのまま使用します。 アプリケーションに ChatService という名前を付け、[OK] をクリックします。

Screenshot that shows the New Project dialog box. Cloud is selected in the Office Share Point folder. Chat Service is in the Name field.

[新しい Windows Azure クラウド サービス] ダイアログで、[ASP.NET Web ロール] を選びます。 右矢印ボタン (>) をクリックして、ソリューションにロールを追加します。

新しいロールの上にマウスを置くと、鉛筆アイコンが表示されます。 このアイコンをクリックして、ロールの名前を変更します。 ロールに「SignalRChat」という名前を付け、[OK] をクリックします。

Screenshot that shows the New Windows Azure Cloud Service dialog box. Signal R Chat is typed above A S P dot NET Web Role.

[新しい ASP.NET プロジェクト] ダイアログで、[MVC] を選び、[OK] をクリックします。

Screenshot that shows the New A S P dot NET Project dialog box. M V C is the selected template.

プロジェクト ウィザードを使って 2 つのプロジェクトを作成します。

  • ChatService: このプロジェクトは Windows Azure アプリケーションです。 Azure のロールとその他の構成オプションを定義します。
  • SignalRChat: このプロジェクトは ASP.NET MVC 5 プロジェクトです。

SignalR チャット アプリケーションを作成する

チャット アプリケーションを作成するには、チュートリアル SignalR と MVC 5 の概要に関する記事の手順に従います。

NuGet を使って必要なライブラリをインストールします。 [ツール] メニューで、[NuGet パッケージ マネージャー] を選び、[パッケージ マネージャー コンソール] を選びます。 [パッケージ マネージャー コンソール] ウィンドウで、次のコマンドを入力します。

Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR
Install-Package -ProjectName SignalRChat Microsoft.AspNet.SignalR.ServiceBus

Windows Azure プロジェクトではなく、ASP.NET MVC プロジェクトにパッケージをインストールするには、-ProjectName オプションを使います。

バックプレーンを構成する

アプリケーションの Startup.cs ファイルに、次のコードを追加します。

public void Configuration(IAppBuilder app)
{
    // Any connection or hub wire up and configuration should go here
    string connectionString = "";
    GlobalHost.DependencyResolver.UseServiceBus(connectionString, "Chat");  

    app.MapSignalR();
}

次に、サービス バスの接続文字列を取得する必要があります。 Azure portal で、作成したサービス バス名前空間を選び、[アクセス キー] アイコンをクリックします。

Screenshot that shows a plus sign labeled Create, a key labeled Access Key, and a trash can labeled Delete.

接続文字列をクリップボードにコピーし、それを connectionString 変数に貼り付けます。

Screenshot that shows the Access Key Connect to your namespace dialog box.

string connectionString = "Endpoint=sb://xxxx.servicebus.windows.net/;
SharedSecretIssuer=owner;SharedSecretValue=XXXXXXXX";

Azure に展開する

ソリューション エクスプローラーで、ChatService プロジェクト内の Roles フォルダーを展開します。

Screenshot that shows an open folder titled Roles. Signal R Chat is selected.

SignalRChat ロールを右クリックし、[プロパティ] を選びます。 [構成] タブを選択します。[インスタンス] で 2 を選びます。 VM サイズを [極小] に設定することもできます。

Screenshot that shows Instances. The Instance count is set to 2 and the V M Size is set to Extra small.

変更を保存します。

ソリューション エクスプローラーで、ChatService プロジェクトを右クリックします。 公開を選択します。

Screenshot that shows Solution Explorer. Publish is selected in the Chat Service context menu.

Windows Azure に初めて発行する場合は、資格情報をダウンロードする必要があります。 [発行] ウィザードで、[サインインして、資格情報をダウンロードする] をクリックします。 これにより、Windows Azure portal にサインインし、発行設定ファイルをダウンロードするよう求められます。

Screenshot that shows the Publish Windows Azure Application dialog box. Sign in to download credentials is circled in red.

[インポート] をクリックし、ダウンロードした発行設定ファイルを選びます。

次へ をクリックします。 [発行の設定] ダイアログの [クラウド サービス] で、先ほど作成したクラウド サービスを選びます。

Screenshot that shows the Windows Azure Publish Settings page.

[発行] をクリックします。 アプリケーションをデプロイして VM を起動するには、数分かかる場合があります。

ここでチャット アプリケーションを実行すると、ロール インスタンスは Service Bus トピックを使って Azure Service Bus 経由で通信します。 トピックは、複数のサブスクライバーを許可するメッセージ キューです。

バックプレーンはトピックとサブスクリプションを自動的に作成します。 サブスクリプションとメッセージ アクティビティを確認するには、Azure portal を開き、Service Bus 名前空間を選び、[トピック] をクリックします。

Screenshot of navigation menu with topics selected.

メッセージ アクティビティがダッシュボードに表示されるまでに数分かかります。

Screenshot that shows a graph of subscription and message activity on a timeline.

SignalR はトピックの有効期間を管理します。 アプリケーションがデプロイされている限り、トピックを手動で削除したり、トピックの設定を変更したりしないでください。

トラブルシューティング

System.InvalidOperationException "サポートされている唯一の IsolationLevel は 'IsolationLevel.Serializable' です。"

このエラーが発生する可能性があるのは、操作のトランザクション レベルが Serializable 以外に設定されている場合です。 他のトランザクション レベルで操作が実行されていないことを確認してください。