クラウド上での

セミナー&ハンズオン ラボ シリーズ
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