ごった煮

色々な事を書いてます

SignalRアプリケーションをスケールアウトする

Webサービスを展開するうえで, 大量のトランザクションを捌くためには, それ相応のマシンスペックが必要になってきます.

考えられる対処法としては, スケールアップとスケールアウトが挙げられます.

スケールアップは, 文字通りRAMやCPUなど, マシンパワーをパワーアップさせる手段です. この方法は, パーツの換装など非常に簡単に行える半面, すぐにスペック的に頭打ちになってしまいます.

そこでより効率的かつ, 頭打ちになりにくい方法がスケールアウトです.

スケールアウトとは

スケールアウトは, マシン自体のスペックアップを行うわけではなく, 横に別のマシンを繋げて複数台のマシンで処理を捌くことを指します.

この処理では, 処理スペックが横につなげられるだけ広げられる反面, スケールアップよりも複雑な処理が必要となってきます.

そこで今回は, SignalRアプリケーションをスケールアウトさせる方法を説明します.

早速やってみる

SignalRをスケールアウトする方法は, いくつか存在します. そのため今回は, AzureのServiceBus機能を使用した方法を説明します.

ServiceBusを作成する

Azureのポータルサイトから, ServiceBusを新規作成します.

簡易作成でサクッと作りましょう.

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

次にSignalRのアプリケーションを作成します.

今回は, 基本的なSignalRアプリケーションの作成方法は割愛して, スケールアウトに必要な部分のみを説明します.

  1. Microsoft.AspNet.SignalR.ServiceBus をNuGetから取得
  2. ServiceBusの接続文字列を取得

servicebus1

画面下の接続情報をクリックすると, Endpoint~ から始まる文字列が取得できます.

これをどこかにメモしておきましょう.

  1. Azureでクラウドサービスを作成

ServiceBus同様に, Azureポータルサイトクラウドサービスを簡易作成で作成します.

  1. VisualStudioで, クラウドサービスを作成

VisualStudioのテンプレートから, クラウドサービスを選択します. クラウドサービス作成時にASP.NET Webロールを選択して作成します.

  1. プログラムを書く

先ほど選択したWebロールの中にSignalRアプリケーションを構築します.

また, Startup.csの中に以下のプログラムを追加します.

[csharp] public void Configuration(IAppBuilder app) { string connectionString = "connection string"; GlobalHost.DependencyResolver.UseServiceBus(connectionString, "AppName"); app.MapSignalR(); } [/csharp]

connectionStringに接続文字列を, AppNameにアプリケーション名を入れます

  1. スケールアウトするインスタンス数を設定する

VisualStudioで作成したクラウドサービスのプロジェクトのプロパティを開き, インスタンス数を好きな数に, インスタンスのスペックを好きなものに変更します.

  1. デプロイする

最後にクラウドサービスをデプロイします.

デプロイは, 通常のWebサイトと同じ要領でデプロイを行います.

まとめ

これで, ServiceBusを使用したスケールアウトの方法は以上です. これ以外にも, KVSのRedisを使用した方法などが存在しますので, 好きなほうを使用してみてください.