セミナー&ハンズオン ラボ シリーズ Windows Azure ハンズオントレーニング クラウド上での リアルタイム・非同期・双方向通信 アプリケーション開発基礎 1 アジェンダ ❖Windows Azure 概要 ❖SignalR ❖ハンズオン ラボについて ❖情報リソース 2 Windows Azure 概要 3 Windows Azure 概要 Windows Azure のサービス群 仮想マシン クラウド サービス Web サイト (Virtual Machines) (Cloud Services) (Web Sites) SQL データベース ストレージ (SQL Database) (Storage) アクセス制御&AD (ACS & Active Directory) サービス バス キャッシュ (Service Bus) (Caching) 4 コンテンツ配信 メディア配信 (CDN) (Media) 仮想ネットワーク (Virtual Network) トラフィック管理 (Traffic Manager) Windows Azure 概要 Windows Azure のデータセンター データセンター CDN 5 Windows Azure 概要 コンピューティングの 3 つの選択肢 アプリケーション アプリケーション アプリケーション アプリケーション データ データ データ データ ファイアウォール ファイアウォール ファイアウォール ネットワーク 仮想ネットワーク 仮想ネットワーク OS OS 仮想化 ハードウェア 6 SignalR 7 SignalR SignalR とは? ❖リアルタイムかつ双方向の通信を簡単に実現 ❖考え方はリモートプロシージャコール ❖サーバからクライアントへのプッシュが可能 ❖NuGet (パッケージマネージャ)を通じて提供 SignalR SignalR を利用するシナリオ ❖サーバからのプッシュを利用する ❖ステータスの変化を即座に通知 (Ex. Windows Azure 管理ポータル, Facebook) ❖リアルタイム、双方向通信を利用する ❖メッセージの送受信 (Ex. チャット、サービス内 API) SignalR SignalR のアーキテクチャ SignalR サーバ クライアント サーバのレスポンス (ブロードキャスト) サーバへのリクエスト (メソッド呼び出し) 10 SignalR サーバサイドの仕組み ❖ASP.NET 上に構築されている ❖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 ❖SignalR で管理している全てのクライアントを表す ❖Caller ❖リクエストを行ったクライアントを表す SignalR サーバ-クライアント間接続の仕組み ❖SignalR がクライアントを管理 ❖クライアントごとに一意なコネクションIDを発行 ネゴシエーション ConnectionId = CAB9F88C-0372-4237A150-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 クライアントサイドの実装 ❖各種クライアントライブラリを提供 ❖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"); }); 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 型のメッセージングを利用 ❖Windows Azure サービスバス ❖Redis (Windows Azure Virtual Machine) ❖プラグインとして NuGet 経由で提供 ❖SignalR.WindowsAzureServiceBus ❖SignalR.Redis SignalR Pub/Sub 型のメッセージング ❖Windows Azure サービスバス ❖メッセージの流れ トピック1 サブスクライバー (インスタンス1) パブリッシャー (インスタンス0) トピック2 サブスクライバー トピック3 29 (インスタンス2) SignalR 実際のスケールアウト例 Windows Azure サービスバス Redis インスタンス0 インスタンス1 接続情報の共有 SignalR Windows Azure と Redis の比較 ❖メッセージ数課金 ❖\0.88/10000 メッセージ ❖スケールアウト ❖トピック数を増やす 非常に容易 ❖時間課金 ❖Sインスタンス \7.00/h ❖スケールアウト ❖サーバを増やす Redis 自体の知識が 要求される SignalR まとめ ❖SignalR を利用するメリット ❖シンプルなクライアント・サーバ API ❖非同期・マルチスレッドで動作 ❖最新・最適な通信方式を自動選択 ❖スケールアウトが非常に容易 ❖クライアント・グループ管理が用意済み 開発者は機能の実装に 集中できる 32 ハンズオン ラボについて 33 ハンズオン ラボの演習内容 ❖演習1:簡単なSignalRアプリケーションの開発 ❖Windows Azure Web Sites へのデプロイまで ❖演習2:チャットアプリケーションの開発 ❖より実践的なアプリケーションの開発 ❖演習3:(おまけ)Windows Azureへ配置し、 スケールアウトを行 う ❖複数インスタンス上での動作を確認 34 情報リソース 35 情報リソース 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-59664A83-B309-53B7B77EDF78 36 情報リソース SignalR 関連 ❖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 37
© Copyright 2024 ExpyDoc