Q#に引き続き、SignalR関連セッションの情報まとめです。
(ブレークアウトセッション) Meet the new stack for real-time web communication: ASP.NET Core SignalR
ASP.NET Core SignalR overview
- "Hubs" を使ったRPC style
- ServerからClientはglobal, グループ、個別を選べる
- HubのメソッドからのStreamの返り値はChannelクラスとなる
- クライアントライブラリはTS/JSと.NET
- JSONとMessagePackがドキュメント化されている実装プロトコル
- WebScockets, Server Sent Events, Long Pollingから選択
- ASP.NET Coreのrouting, DIとの統合
- Redisもしくは新しいAzureのサービスを利用してスケールできる
既存のSignalR からの変更点
- jQueryの依存性なし
- メッセージの再送つきの自動再接続なし
- Hubの状態ももたなくなった
- 複数Hubのendpointもなし
- 単一モデルでのスケールアウトもなし
- 複数サーバー間のping-pongがなくなるため、sticky sessionが必要となる
SignalR機能概要
- routing
- Hubパラメーターbinding
- JSON および MessagePackプロトコル
- Controllerからのpush通知
- グループとbackgroundサービスからのpush通知
- 型付のHub
- 認可
- HubメソッドからのStream
- .NET Client
Hubの下回りの構造
従来のSingalRは Hub-HubDispatcher-PersistentConnectionMiddleware-OWIN-System.Web HttpHandler
ASP.NET Core SignalR Hub-HubConnectionHundler-HubConnectionDispatcher-RoutingMiddleware-ASP.NET Core HTTP Pipeline
HTTPではなくTCP/IPを利用した転送も計画中
over HTTPの場合 Hub-HubConnectionHandler-HttpConnectionDispatcher-RoutingMiddleware-ASP.NET Core HTTP pipeline-Kestrel-Sockets or Libuv
over TCP/IP Hub-HubConnectionHandler-Kestrel-Sockets or Libuv
Project Bedrockの紹介
- .NETのための新しい高パフォーマンスネットワーク抽象化
- transport層からapplication層を取り除く
- System.Net.Sockets と libuv を利用
- アプリケーション層の書き換えなしに導入可能
- ASP.NET Coreを対象
- 新しいSystem.IO.Pipelines APIを利用
- ClientとServer両方
ベンチマークを公開中 https://aka.ms/aspnet/benchmarks
Demoサンプル
KestrelHttpServer/BenchmarkApplication.cs at dev · aspnet/KestrelHttpServer · GitHub
Azure SignalR Service
- SignalR clientの接続とスケールアウトのためのPaaS
- ASP.NET Core SignalR と Bedrockを利用
- サービスへの接続のオフロードやアプリケーションから/へのトラフィックの転送
- ドキュメント化されているプロトコルが利用可能
- web側のtrafficと独立してSignalRのみの簡単のスケールが可能
- 2行のコードの変更で既存アプリから変更可能
- public preview!
Azure SignalR Serviceの利用
- アプリケーションは接続文字列を利用して接続
- サービスからのレスポンスはアクセストークンと接続先URL
- クライアントはnegotiate requestを送信する https://github.com/aspnet/SignalR/blob/dev/specs/TransportProtocols.md#post-endpoint-basenegotiate-request
- クライアントはアクセストークンとURLを使って接続する
- サービスはサーバーとクライアント間のメッセージを中継する
これだったのか Hub-HubConnectionHandler-HubConnectionDispatcher-RoutingMiddleware-ASP.NET Core HTTP Pipeline
こうなる Hub-HubConnectionHandler-ServiceHubDispatcher-WebSocket Clients
今後の実装計画
- クライアント再接続
- より柔軟な接続。client intiated pingsなど
- クライアント側の型付Hub
- Java,C++,iOSなどのクライアント
- TCP/IPを含めたさらなるtransports。サンプルではなく実際に利用できるものとして。
(シアターセッション) Build and manage real-time applications easily with the all new Azure SignalR Service
こちらは動画が公開されていないので、見てきたときのメモから。
Azure SignalR Service, a fully-managed service to add real-time functionality https://azure.microsoft.com/en-us/blog/azure-signalr-service-a-fully-managed-service-to-add-real-time-functionality/
数十人の参加者に開発したことのあるSignalRの規模を質問。ぱっと見た限り、100接続以上が10人くらい、1000接続が数人、10000接続以上はなし。
- 上のセッションで公開したデモは2'40ほどの間に800人から接続され、100万メッセージ以上、秒間だいたい35kを処理。
- Free Tier/Basic Tier
- 使えるリージョンはいまのところ US E/US W/SE Asia/EU W
- サービスを作成すると接続文字列が表示されるので、それをアプリ側で設定。
- Azure Functionsを使ってServerless構成も可能