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