銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Microsoft Build 2018 のSignalR関連のセッションの整理

Q#に引き続き、SignalR関連セッションの情報まとめです。

tech.tanaka733.net

(ブレークアウトセッション) 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の利用

これだったのか 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構成も可能