クラウド上での リアルタイム・非同期・双方向通信アプリケーション開発基礎
アジェンダ Windows Azure 概要 SignalR ハンズオン ラボについて 情報リソース
Windows Azure 概要
(ACS & Active Directory) Windows Azure 概要 Windows Azure のサービス群 仮想マシン (Virtual Machines) クラウド サービス (Cloud Services) Web サイト (Web Sites) SQL データベース (SQL Database) ストレージ (Storage) コンテンツ配信 (CDN) メディア配信 (Media) アクセス制御&AD (ACS & Active Directory) サービス バス (Service Bus) キャッシュ (Caching) 仮想ネットワーク (Virtual Network) トラフィック管理 (Traffic Manager)
Windows Azure 概要 Windows Azure のデータセンター データセンター CDN
Windows Azure 概要 コンピューティングの 3 つの選択肢 オンプレミス アプリケーション アプリケーション アプリケーション 仮想マシン クラウド サービス Web サイト アプリケーション アプリケーション アプリケーション アプリケーション データ データ データ データ ファイアウォール ファイアウォール ファイアウォール ネットワーク 仮想ネットワーク 仮想ネットワーク OS OS 仮想化 ハードウェア オンプレミス
SignalR
SignalR SignalR とは? リアルタイムかつ双方向の通信を簡単に実現 NuGet (パッケージマネージャ)を通じて提供 考え方はリモートプロシージャコール サーバからクライアントへのプッシュが可能 NuGet (パッケージマネージャ)を通じて提供
SignalR SignalR を利用するシナリオ サーバからのプッシュを利用する リアルタイム、双方向通信を利用する ステータスの変化を即座に通知 (Ex. Windows Azure 管理ポータル, Facebook) リアルタイム、双方向通信を利用する メッセージの送受信 (Ex. チャット、サービス内 API)
SignalR SignalR のアーキテクチャ クライアント SignalR サーバ サーバのレスポンス サーバへのリクエスト (ブロードキャスト) サーバへのリクエスト (メソッド呼び出し)
SignalR サーバサイドの仕組み ASP.NET 上に構築されている API エンドポイント “Hub” Web Forms, MVC, Web Pages などと共存可能 API エンドポイント “Hub” クライアントから呼び出し可能なメソッドの集合 http://***.cloudapp.net/signalr SomeMethod_1 SomeMethod_2 Hub_1 SomeMethod_1 Hub_2
SignalR サーバサイドの実装 Hub の実装例 クライアントに公開する名前 クライアントから呼び出し可能なメソッド [HubName("chat")] public class ChatHub : Hub { public void SendMessage(string text) Clients.ReceiveMessage(text); } クライアントから呼び出し可能なメソッド
SignalR サーバから利用できる情報 Hub クラスに実装されているプロパティ Context Groups Clients 現在のリクエスト情報を保持 Groups グループを管理するクラス Clients SignalR で管理している全てのクライアントを表す Caller リクエストを行ったクライアントを表す
SignalR サーバ-クライアント間接続の仕組み SignalR がクライアントを管理 クライアントごとに一意なコネクションIDを発行 ネゴシエーション ConnectionId = CAB9F88C-0372-4237-A150-1A870583BCDA コネクションID発行
クライアントとサーバのメソッド名 が対応している SignalR クライアントからサーバ サーバに用意されたメソッドを呼び出す クライアントは戻り値を取ることが出来る サーバの メソッド呼び出し chat.invoke("SendMessage", text); public void SendMessage(string text) { } クライアントとサーバのメソッド名 が対応している
クライアントとサーバのメソッド名 が対応している SignalR サーバからクライアント クライアントに登録されたメソッドを呼び出す サーバは戻り値を取ることが出来ない クライアントの メソッド呼び出し chat.on("ReceiveMessage", function(text) { }); Clients.ReceiveMessage(text); クライアントとサーバのメソッド名 が対応している
SignalR 接続のグルーピング クライアントをグループ化して管理 グループごとの 操作が可能 グループA グループB
SignalR 接続のグルーピング グループに接続を追加する実装 [HubName("chat")] public class ChatHub : Hub { public void JoinGroup(string groupName) Groups.Add(Context.ConnectionId, groupName); } public void LeaveGroup(string groupName) Groups.Remove(Context.ConnectionId, groupName); グループに追加 グループから削除
SignalR グループへのメソッド呼び出し グループへのメソッド呼び出し [HubName("chat")] public class ChatHub : Hub { public void SendMessage(string groupName, string text) Clients[groupName].ReceiveMessage(text); } グループに対してメソッド呼び出し
SignalR クライアントサイドの実装 各種クライアントライブラリを提供 SignalR と同様に NuGet を通じて提供 JavaScript (SignalR と同時にインストール) .NET Framework 4.5 / Windows Store アプリ Silverlight 4 / 5 SignalR と同様に NuGet を通じて提供
SignalR クライアントサイドのライブラリ JavaScript コールバック、jQuery.Deferred を使う var connection = $.hubConnection(); var chat = connection.createProxy("chat"); chat.on("ReceiveMessage", function(message) { alert(message); }); connection.start(function() { chat.invoke("SendMessage", "text message");
SignalR クライアントサイドのライブラリ .NET Framework 4.5 / Windows Store アプリ async / await 記法を使う var connection = new HubConnection("http://localhost:12345/"); var chat = connection.CreateProxy("chat"); chat.On<string>("ReceiveMessage", message => MessageBox.Show(message)); await connection.Start(); chat.Invoke("SendMessage", "text message");
SignalR クライアントサイドのライブラリ Silverlight 4 / 5 Task ベースの API をそのまま使う var connection = new HubConnection("http://localhost:12345/"); var chat = connection.CreateProxy("chat"); chat.On<string>("ReceiveMessage", message => MessageBox.Show(message)); connection.Start().ContinueWith(p => { chat.Invoke("SendMessage", "text message"); });
WebSocket, SSE, Frame, Long-polling SignalR SignalR で使われている技術 複数のトランスポート(接続)をサポート WebSocket (IIS 8 と .NET 4.5 の組み合わせ) Server-Sent Events (SSE) Infinity Frame Long-polling トランスポート WebSocket, SSE, Frame, Long-polling
> > > SignalR トランスポートとブラウザの関係 自動的にトランスポートを切り替える WebSocket : Server-Sent Events : Infinity Frame : Long-polling : 古いブラウザ > > >
SignalR スケールアウトの問題点 永続的なコネクションをインスタンス毎に作成 単純に数を増やすだけでは対応できない インスタンス0 インスタンス1
SignalR スケールアウト インスタンス間で接続を共有する必要がある メッセージングを利用する 接続情報の共有 インスタンス0 インスタンス1
SignalR メッセージングを使ってスケールアウト Pub/Sub 型のメッセージングを利用 プラグインとして NuGet 経由で提供 Windows Azure サービスバス Redis (Windows Azure Virtual Machine) プラグインとして NuGet 経由で提供 SignalR.WindowsAzureServiceBus SignalR.Redis
SignalR Pub/Sub 型のメッセージング Windows Azure サービスバス メッセージの流れ トピック1 サブスクライバー (インスタンス1) トピック2 パブリッシャー (インスタンス0) サブスクライバー (インスタンス2) トピック3
SignalR 実際のスケールアウト例 Windows Azure サービスバス Redis インスタンス0 インスタンス1 接続情報の共有
SignalR Windows Azure と Redis の比較 メッセージ数課金 スケールアウト 時間課金 スケールアウト \0.88/10000 メッセージ スケールアウト トピック数を増やす 時間課金 Sインスタンス \7.00/h スケールアウト サーバを増やす 非常に容易 Redis 自体の知識が要求される
SignalR まとめ SignalR を利用するメリット 開発者は機能の実装に 集中できる シンプルなクライアント・サーバ API 非同期・マルチスレッドで動作 最新・最適な通信方式を自動選択 スケールアウトが非常に容易 クライアント・グループ管理が用意済み 開発者は機能の実装に 集中できる
ハンズオン ラボについて
ハンズオン ラボの演習内容 演習1:簡単なSignalRアプリケーションの開発 演習2:チャットアプリケーションの開発 Windows Azure Web Sites へのデプロイまで 演習2:チャットアプリケーションの開発 より実践的なアプリケーションの開発 演習3:(おまけ)Windows Azureへ配置し、 スケールアウトを行う 複数インスタンス上での動作を確認
情報リソース
情報リソース Windows Azure 関連 Windows Azure 管理ポータルサイト Windows Azure 情報サイト http://manage.windowsazure.com/ Windows Azure 情報サイト http://www.windowsazure.com/ Windows Azure SDK ドキュメント http://msdn.microsoft.com/ja-jp/library/dd163896.aspx Windows Azure Team Blog (英語) http://blogs.msdn.com/b/windowsazure/ Windows Azure 開発ツール ダウンロード http://www.windowsazure.com/ja-jp/develop/downloads/ Windows Azure 管理ツール ダウンロード http://www.windowsazure.com/ja-jp/manage/downloads/ Windows Azure Platform Training Kit (英語) http://www.microsoft.com/downloads/details.aspx?FamilyID=413E88F8-5966-4A83-B309-53B7B77EDF78
情報リソース SignalR 関連 SignalR 公式サイト (英語) SignalR – GitHub プロジェクトサイト (英語) http://signalr.net/ SignalR – GitHub プロジェクトサイト (英語) http://github.com/SignalR SignalR – Wiki ページ (英語) http://github.com/SignalR/SignalR/wiki SignalR – Twitter (英語) http://twitter.com/SignalR SignalR – NuGet Gallery http://nuget.org/packages/SignalR