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

完了

Polling-based web application.

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

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

この関数と元の getStocks 関数との主な違いは、関数がデータの変更に基づいてトリガーされるようになったことです。 前の演習では、クライアントからの要求に基づいて関数をトリガーし、Azure Cosmos DB の入力バインディングを通じてすべてのデータを戻しました。 Azure Cosmos DB トリガーを使用することで、自動的にデータの取得がより効率的になります

Azure Functions の特徴は、Azure Cosmos DB の変更フィードでデータが更新されるたびにコードを実行するバインディングです。 関数で変更フィードがリッスンされたら、データ変更のみを表す、データのサブセットを操作することができます。 クライアントへの永続的な接続と組み合わせると、関数で、リアルタイムのアプリケーション アーキテクチャの基礎である、オンデマンドで個々のクライアントに接続することができます。

SignalR と永続的な接続

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

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

SignalR によって提供される抽象化の主な利点は、"トランスポート" フォールバックをサポートする方法です。 トランスポートは、クライアントとサーバー間の通信方法です。 SignalR 接続は、標準の HTTP 要求から始まります。 サーバーで接続が評価されるときに、最も適切な通信方法 (トランスポート) が選択されます。 トランスポートは、クライアントで利用可能な API に応じて選択されます。

HTML 5 をサポートするクライアントの場合は、WebSockets API トランスポートが既定で使用されます。 クライアントで 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 の変更フィードを読み取る関数から情報をブロードキャストする方法を見ていきましょう。