SlideShare a Scribd company logo
地理冗長の中心でAzure愛を叫ぶin 名古屋2014.3.1 Kouji Matsui (@kekyo2) 
SignalRブートキャンプ
自己紹介 
Kouji Matsui (@kekyo2) 
名古屋のコミュニティ、MiCoCiのメンバーです。 
「なごやこわい」のメンバーではありませんw 
アーキテクトやってます。あと、スクラム道もはじめました。
リアルタイム通信、始まる 
サーバーとクライアントを接続して、何か連携できることがしたい よね!!TCPとかでリアルタイム通信!ゲーム!! 
でも、基本、クライアントの人だから、サーバーわかんないんだ、 何もかも(遠い目) 
「SignalR」ってライブラリを使えば、簡単にリアルタイム通信出来 るよ!!サーバーの管理なんて、Windows Azureに任せちゃえば いい!
SignalRが使えると? 
SignalRおいしい? それ何? 
TCPでソケット繋いでどうとか、通信電文がどうだとか、面倒な事は 
殆ど自動でやってくれる! → だから、本来実現したかったことに集 
中出来る!! 
ほうほう、それで? 
簡単実現!
SignalRがやってくれる事 
Jsonによる通信(プレーンではない) 
通信手段の自動的な選択 
HTTPやWebSocketなど 
サーバーのメソッドを呼び出 
す感覚でコードを書けるワ
通信を抽象化 
・同報通知も可能 
・特定端末にだけ送信 
・グルーピングして送信
サポートする環境は? 
Windows PC / IE / Chrome / etc... 
Windows Phone / Tablets... 
Windows Server
さぁ、はじめよう!
SignalR使おうとしたら、OWINって? 
Open Web Interface for .NET 
ウェブサーバー向けの新しいフレームワーク 
えぇー?またフレームワーク増えたの?! 
まぁ、そうなんですが、ASP.NET WebFormやMVCとは位置づけがちょっと 違います。SignalRはこれに乗っかります。 
OWINの詳細は知らなくても大丈夫ですが、どんなものなのか、少しだけ紹介 します。 
大丈夫、NuGetを使えば簡単に導入できます!
見せてもらう必要がありそうネ、 全て取り払った最小のコードとやらを 
いくらNuGetで簡単にライブラリを導入 できても、一度にあまりに大量のコード が追加されると、何が何だか... orz 
では、「スクラッチ」に近い状態での コードをお見せします。
論よりOWIN 
OWINの導入は超簡単。NuGet一発! 
”Install-Package Microsoft.Owin.Host.SystemWeb” (2.0.2) 
Owin Microsoft.Owin 
Microsoft.Owin.Host.SystemWeb 
ASP.NETでOWINを動作可能にする 
似たようなパッケージが沢山公開 
されているので、注意!
論よりOWIN 
「OWINスタートアップクラス」を追加 
スタートアップクラスとOwinを結びつける
Hello! OWIN 
IOwinContext–HttpContextの抽象インターフェイス
何がどうなってる? 
ASP.NETウェブフォームでは、HttpContextを受け取るまでに、 System.Web.UI.Pageからページを生成する必要がありました。 
Pageクラスはデカい、ページレンダリングの余分なコードが多い。 シンプルではない。例のように、Hello World的コードであっても、 非常に大がかりな仕掛けが動作します。 
OWINは非常にシンプル。IOwinContextを受け取って動作するま でに必要な、複雑なフレームワーク構造は存在しません。
IOwinContext
OWINでSignalRのセットアップ 
NuGetで一発 
“Install-Package Microsoft.AspNet.SignalR.SystemWeb” (2.0.2) 
Owin Microsoft.Owin Microsoft.Owin.Host.SystemWeb 
Microsoft.AspNet.SignalR.Core 
Microsoft.AspNet.SignalR.SystemWeb
Web.configがおかしい... 
2.0.2をNuGetで導入時に、Web.configに不正なエントリーが追加 されるので、手動で修正が必要。 
アセンブリバージョンの3番目要素を広くする。 この例では「99」に設定した
OWINでSignalRのセットアップ 
OWINスタートアップクラスで、SignalRにコンテキストを転送する 
Microsoft.AspNet.SignalR.Core.dll 
Owin.OwinExtensions.MapSignalR() 
コンテキストパイプラインをSignalRに転送
準備完了 
後はハブとメソッドを 
決めるだけネ?
何を作る? 
ホワイトボードアプリ 
Windows Phone・Silverlight・WPFでリアルタイム白板会議 
手書きのポリライン座標を送受信
まずはサーバー側から 
ハブクラス 
→サーバーAPIの端点。このクラスからAPIメソッドを公開。 
SignalR 
クライアント 
SignalRハブ 
“SharedWhiteBoardHub” ハブ上のメソッド群 
“PlaceLine”
ハブクラスの実装 
ハブクラス →サーバーAPIの端点。このクラスからAPIメソッドを公開。 
Microsoft.AspNet.SignalR.Hubクラス 
Hubクラスを継承すると、自動的に認識される 
外部から呼び出されるメソッドの定義 
接続中の全てのクライアントの「DrawLine」 メソッドにコールバック
送受信データの定義 
文字列や数値が1~4個なら、直接引数に定義できます。 
それ以上の複雑なデータをやり取りする場合は、エンティティクラス を定義して、このクラスごと送受信します。 
エンティティクラスは、DataContract属性で修飾した、パブリック な値の入れ物とします。 
最終的に、Json.NETによってJsonとの相互変換が行われる事に注意。 
全く同じクラスをサービス側とクライアント側の両方で定義しても良 いが、どうせならPortable Class Libraryにして共用しよう。
送受信データの定義 
DataContract属性で修飾したクラス 
DataMember属性で修飾したパブリックなプロパティ 
必要なだけメンバを定義可能。Jsonで表現可能か どうかは考慮する必要がある。
クライアント側は? 
 クライアントから、ハブのメソッドを呼び出す 
 サーバーからのコールバックを受信する 
“SharedWhiteBoardHub” PlaceLine() 
DrawLine()
クライアントの実装(NuGet導入) 
まずはクライアントにNuGetでライブラリを導入(2.0.2) “Install-Package Microsoft.AspNet.SignalR.Client” 
あるいは、Portable Class Library版(2.0.1) “Install-Package Microsoft.AspNet.SignalR.Client.Portable” (これは私が作って配布したものです。SL4/WP7.5にも対応、但し、 WebSocket接続は出来ません) 
パッケージ依存は多いので、図での説明は省略します(汗 BCL, Json.NET, HttpClientなど
クライアントの実装(ハブへの接続) 
クライアントの動作を開始 
HubConnectionクラスが、ハブへの接続を管理する 
CreateHubProxyで、サーバーのハブクラスの プロキシ(代理)インスタンスを生成する。 
型はIHubProxyインターフェイス。
クライアントの実装(ハブのメソッドを実行) 
LineInformationクラス(エンティティ)に、 送信する情報を代入 
保存しておいたハブプロキシのInvokeメソッドを呼び出す。 
メソッド名:「PlaceLine」 
必要ならawaitする
クライアントの実装(コールバック1) 
コールバックするスレッドはワーカース レッドなので、UIを操作するにはUIスレッ ド(メインスレッド)へのマーシャリング が必要。
クライアントの実装(コールバック2) 
Start前に、コールバックメソッドを登録する。 
On<T>のT型が、受信する引数
デモ 
上手く行かなかったら... 
わかってるわネ? Try it! http://signalrbootcamp.cloudapp.net/WhiteBoard.html
IIS ExpressからAzureへ 
SignalRはもちろん、Azure 上で使えます。 
WebSocketで接続OKです。 
OS Family 3以降が必要 (Windows Server 2012) 
クライアント側が.NET4.5以 上かつWindows 8以上 
WireSharkでWebSocket パケットを確認
AzureTips 
標準的な使用方法は、クラウドサービス(Webロール) 
ワーカーロールでも使用可能。OWINのホストをワーカーロールで実行する (NuGetで、OWIN hostで検索すると、色々出てきます)。 
Webサイトでも使用可。但し、WebSocketで接続する場合は、最大接続数 の制限に注意。 
Free: (5)concurrent connections per website instance 
Shared: (35) concurrent connections per website instance 
Standard: (350) concurrent connections per website instance 
http://blogs.msdn.com/b/windowsazure/archive/2013/11/14/introduction-to-websockets-on-windows-azure-web-sites.aspx
WebSocketは高速だけど... 
WebSocketはHTTPで接続した際のTCPソケットを使 用し続けます。 →リソース消費としては大きい。 
また、TCPとして接続が維持され続けるため、これを 逆手にステートフル・セッションリッチなインター フェイスを考えてしまいます。 
が、それではAzureの強みである「スケーラブルなイ ンスタンスの拡張」が出来なくなってしまいます。 
どうやって対処する?
スケーラビリティ1 VIPスワップでは切断されない 
インスタンスを入れ替える場合に、VIPスワップを使うと、クライ 
アント側のWebSocket接続(TCP接続)を維持したまま、インス 
タンスを入れ替える事が出来ます。 
WebSocket接続 
(維持される) 
VIPスワップ 
ここは切断される 
WebSocketを認識する 
負荷分散ルーターDB(データ)
クライアント側の接続は維持されますが、サーバー側は当然維持さ れません。そのため、Azure内のWebSocketが切断され、かつクラ イアント側は接続が維持されているということを念頭に置く必要が あります。 
HTTPによるREST APIの置き換えシナリオであれば、初めからステートレス で設計している筈なので、この挙動に問題なくフィットします。 (恐らく、必要なデータはバックエンドのDBに保存している筈) 
WebSocketでの接続を念頭に置いていると、便利さゆえに、どこかでステー トフルな設計にしてしまう可能性があるので、注意が必要です。 
スケーラビリティ1 VIPスワップでは切断されない
複数のインスタンスが存在すると、インスタンスをまたがってクライ 
アントとのメッセージ送受信を実行する必要があります。 
スケーラビリティ2 インスタンス間通信 
異なるインスタンスに 
接続している 
どうやってメッセージ 
を送受信する? 
DBを経由?
SignalRにインスタンス間通信の為の拡張インターフェイスがありま 
す。Azure上では”Azure ServiceBus”が使えます。 
スケーラビリティ2 インスタンス間通信 
Azure ServiceBus
Azure ServiceBusは「Microsoft ASP.NET SignalRService Bus Messaging Backplane」という名称でNuGetで公開されています。 “Install-Package Microsoft.AspNet.SignalR.ServiceBus“ http://www.asp.net/signalr/overview/signalr-20/performance- and-scaling/scaleout-with-windows-azure-service-bus 
ServiceBusの実装は、あまりに多いクライアントにはフィットしな いとの話があります。 
他にも、SQL Serverを使うものや、OSSインメモリデータベースの Redisを使用した実装などがあります。 
スケーラビリティ2 インスタンス間通信
Cheers! 
本日のスライド・サンプルコードは、後日 ブログに掲載します。 
kekyoの丼 http://kekyo.wordpress.com

More Related Content

PDF
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...
PPTX
Spring CloudとZipkinを利用した分散トレーシング
PPTX
ここからはじめる SQL Server の状態取得
PDF
Oracle Data Guard による高可用性
PDF
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
PPTX
サポート エンジニアが Azure Networking をじっくりたっぷり語りつくす会
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
PPTX
Spanner移行について本気出して考えてみた
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...
Spring CloudとZipkinを利用した分散トレーシング
ここからはじめる SQL Server の状態取得
Oracle Data Guard による高可用性
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
サポート エンジニアが Azure Networking をじっくりたっぷり語りつくす会
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
Spanner移行について本気出して考えてみた

What's hot (20)

PDF
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
PPTX
Oracleのソース・ターゲットエンドポイントとしての利用
PPTX
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(基礎編)配布用
PDF
シンプルでシステマチックな Oracle Database, Exadata 性能分析
PDF
待ち事象から考える、Sql server の改善ポイント
PPTX
iostat await svctm の 見かた、考え方
PDF
[Oracle DBA & Developer Day 2012] 高可用性システムに適した管理性と性能を向上させるASM と RMAN の魅力
PPTX
SCUGJ第27回勉強会:ものすごくざっくりなAzure Filesの話
PDF
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
PDF
【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック
PDF
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
PPTX
Oracle Cloud PaaS & IaaS:2019年11月度サービス情報アップデート
PDF
Sql server よく聞く設定とその効果
PDF
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PPTX
AWSで作る分析基盤
PDF
使ってみて気づいた AGPL ライセンスの メリット・デメリット
PDF
GoldenGateテクニカルセミナー2「Oracle GoldenGate 新機能情報」(2016/5/11)
PDF
忙しい人の5分で分かるDocker 2017年春Ver
PDF
【CNDT2022】SIerで実践!クラウドネイティブを普及させる取り組み
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
Oracleのソース・ターゲットエンドポイントとしての利用
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(基礎編)配布用
シンプルでシステマチックな Oracle Database, Exadata 性能分析
待ち事象から考える、Sql server の改善ポイント
iostat await svctm の 見かた、考え方
[Oracle DBA & Developer Day 2012] 高可用性システムに適した管理性と性能を向上させるASM と RMAN の魅力
SCUGJ第27回勉強会:ものすごくざっくりなAzure Filesの話
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック
[B31] LOGMinerってレプリケーションソフトで使われているけどどうなってる? by Toshiya Morita
Oracle Cloud PaaS & IaaS:2019年11月度サービス情報アップデート
Sql server よく聞く設定とその効果
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
AWSで作る分析基盤
使ってみて気づいた AGPL ライセンスの メリット・デメリット
GoldenGateテクニカルセミナー2「Oracle GoldenGate 新機能情報」(2016/5/11)
忙しい人の5分で分かるDocker 2017年春Ver
【CNDT2022】SIerで実践!クラウドネイティブを普及させる取り組み
Ad

Similar to SignalRブートキャンプ (20)

PPTX
Interactive connection2
PDF
Teamsの裏側? Azure Communication Servicesのプレビューが出たので、さっそく触ってみた話
PPTX
Interoperability of webassembly with javascript
PDF
20190731 Azure Functions x Line at Azure Tech Lab #4
PDF
.NET Lab2022年2月
PDF
A 1-2 One ASP.NET - ASP.NET Web Stack
PPTX
20200214 c#tokyo lt_upload
PPTX
できる!サーバレスアーキテクチャ
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
PPTX
Windows Azure Appfabric as "Middleware as a Services"
PDF
ネットワークコマンド入力に対応したツール事例
PDF
.NET の今とミライ (.NET Conf 2018 Japan Keynote)
PDF
Let's begin WebRTC
PDF
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
PDF
PlayFramework1.2.4におけるWebSocket
PPTX
WebRTC meetup Tokyo 1
PDF
OWIN - .NETにおけるPSGI -
PDF
最新 .NET テクノロジと次世代型アプリ開発 2013 : DE-011, MSC 2013
PDF
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
PDF
Azure Functions 入門
Interactive connection2
Teamsの裏側? Azure Communication Servicesのプレビューが出たので、さっそく触ってみた話
Interoperability of webassembly with javascript
20190731 Azure Functions x Line at Azure Tech Lab #4
.NET Lab2022年2月
A 1-2 One ASP.NET - ASP.NET Web Stack
20200214 c#tokyo lt_upload
できる!サーバレスアーキテクチャ
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Windows Azure Appfabric as "Middleware as a Services"
ネットワークコマンド入力に対応したツール事例
.NET の今とミライ (.NET Conf 2018 Japan Keynote)
Let's begin WebRTC
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
PlayFramework1.2.4におけるWebSocket
WebRTC meetup Tokyo 1
OWIN - .NETにおけるPSGI -
最新 .NET テクノロジと次世代型アプリ開発 2013 : DE-011, MSC 2013
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
Azure Functions 入門
Ad

More from Kouji Matsui (20)

PDF
パターンでわかる! .NET Coreの非同期処理
PDF
Making archive IL2C #6-55 dotnet600 2018
PDF
Matrix signal controller and BrainPad overview
PDF
Fun with BrainPad
PDF
What's Functional?
PDF
Pitfall for WioLTE
PDF
How to make the calculator
PDF
Write common, run anywhere
PDF
Locality of Reference
PDF
Nespのコード生成
PDF
C#でわかる こわくないMonad
PDF
You will be assimilated. Resistance is futile.
PDF
How to meets Async and Task
PDF
Beachhead implements new opcode on CLR JIT
PDF
Async deepdive before de:code
PDF
Thread affinity and CPS
PDF
Async DeepDive basics
PDF
continuatioN Linking
PDF
真Intermediate languageのキホン
PDF
.NET Coreから概観する.NETのOSSへの取り組み
パターンでわかる! .NET Coreの非同期処理
Making archive IL2C #6-55 dotnet600 2018
Matrix signal controller and BrainPad overview
Fun with BrainPad
What's Functional?
Pitfall for WioLTE
How to make the calculator
Write common, run anywhere
Locality of Reference
Nespのコード生成
C#でわかる こわくないMonad
You will be assimilated. Resistance is futile.
How to meets Async and Task
Beachhead implements new opcode on CLR JIT
Async deepdive before de:code
Thread affinity and CPS
Async DeepDive basics
continuatioN Linking
真Intermediate languageのキホン
.NET Coreから概観する.NETのOSSへの取り組み

SignalRブートキャンプ