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 トランスポートは既定で使用されます。
  • WebSocket: クライアントが WebSocket をサポートしていない場合、SignalR はサーバー送信イベント (EventSource とも呼ばれます) にフォールバックします。
  • その他のテクノロジ: 古いクライアントの場合、Ajax long polling または Forever Frame (Internet Explorer のみ) を使用して双方向接続を模倣します。

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

2 つ目の利点は、SignalR を使用すると、クライアントでサポートされているテクノロジに応じてアプリケーションを適切に低下させることです。 WebSocket がサポートされていない場合は、サーバー送信イベントが使用されます。 クライアントがサーバー送信イベントを処理できない場合は、Ajax の長いポーリングなどを使用します。

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