SignalR Service を使って Web アプリケーションの自動更新を有効にする

完了

ポーリングベースの Web アプリケーション。

次に、ポーリングから、接続されているクライアントにデータ更新を (発生したときに) プッシュするアプリに移ります。 この新しい設計ではトラフィックが減り、データが変更されたときにのみ更新することでより効率的な UI を作成することができます。 この更新されたソリューションを提供するために使用する 3 つのテクノロジは、Azure Cosmos DBAzure FunctionsSignalR です。

  • Azure Cosmos DB:データベースのデータが変更されると、Azure Cosmos DB により "変更フィード" が発行されます。 Azure Cosmos DB での変更フィード サポートは、データベース コンテナーの変更をリッスンすることで機能します。 その後、変更されたドキュメントは、変更された順に並べ替えられたリストに出力されます。 アプリケーションで変更フィードをリッスンしていると、データの変更に自動的に応答できます。

  • Azure Functions: この関数と元の getStocks 関数との主な違いは、関数がデータの変更に基づいてトリガーされるようになったことです。 前の演習では、クライアントからの要求に基づいて関数をトリガーし、Azure Cosmos DB の入力バインディングを通じてすべてのデータを戻しました。 Azure Cosmos DB トリガーを使うと、データの取得が自動的に効率化されます。 Azure Functions の特徴は、Azure Cosmos DB の変更フィードでデータが更新されるたびにコードを実行するバインディングです。 関数で変更フィードがリッスンされたら、データ変更のみを表す、データのサブセットを操作することができます。

  • Azure SignalR:このサービスは、Azure Functions アプリからの SignalR ブロードキャストをリッスンするクライアント上の SignalR 接続との双方向通信を提供します。

SignalR と永続的な接続

ポーリングとは対照的に、より好ましい設計の特徴は、クライアントとサーバー間の永続的な接続です。 永続的な接続を確立することで、サーバーでは自由にクライアントにデータをプッシュできるようになります。 接続のオンデマンドの性質により、ネットワーク トラフィックとサーバーへの負荷が軽減されます。 SignalR を使用すれば、この種のアーキテクチャをアプリケーションに簡単に追加することができます。

SignalR は一連のテクノロジの抽象化であり、これを使用することで、アプリではクライアントとサーバー間の双方向通信を利用できるようになります。 SignalR では、自動的に接続管理が処理され、ユーザーは、チャットルームのように、同時に接続されているすべてのクライアントにメッセージをブロードキャストすることができます。 また、特定のクライアントにメッセージを送信することもできます。 クライアントとサーバー間の接続は、通信ごとに再確立される従来の HTTP 接続とは異なり、永続的なものです。

SignalR によって提供される抽象化の主な利点は、"トランスポート" フォールバックをサポートする方法です。 トランスポートは、クライアントとサーバー間の通信方法です。 SignalR 接続は、標準の HTTP 要求から始まります。 サーバーで接続が評価されるときに、最も適切な通信方法 (トランスポート) が選択されます。 クライアントへの永続的な接続と組み合わせると、関数で、リアルタイムのアプリケーション アーキテクチャの基礎である、オンデマンドで個々のクライアントに接続することができます。 トランスポートは、クライアントで使用できる API に応じて選ばれます。

  • HTML 5:HTML 5 をサポートするクライアントの場合は、WebSockets API トランスポートが既定で使用されます。
  • WebSockets:クライアントで WebSockets がサポートされない場合、SignalR によって Server Sent Events (EventSource ともいう) にフォールバックされます。
  • その他のテクノロジ:古いクライアントの場合、双方向接続を模倣するために Ajax long polling または Forever Frame (IE のみ) が使用されます。

SignalR によって提供される抽象化レイヤーでは、アプリケーションで 2 つの利点が得られます。 最初の利点は、アプリの将来の保証です。 Web が進化し、WebSockets より優れた API を利用できるようになると、アプリケーションの変更は必要なくなります。 新しい API をサポートするバージョンの SignalR に更新でき、アプリケーションのコードを見直す必要はありません。

2 つ目の利点は、SignalR を使用することで、クライアントのサポートされているテクノロジに応じて、アプリケーションのグレースフル デグラデーションが可能になることです。 WebSockets がサポートされない場合は、Server Sent Events が使用されます。 クライアントで Server Sent Events を処理できない場合は、Ajax long polling などが使用されます。

SignalR を使って、Azure Cosmos DB の変更フィードを読み取る関数から情報をブロードキャストする方法を見ていきましょう。