web-dev-qa-db-ja.com

従来のポーリング方法よりも優れた方法

私は現在、AngularJS/Javascript環境にいます。

現在、ポーリング方式を使用するアプリケーション(つまり、一定の秒数でサーバーから新しいデータを取得する)。

これは大変な負担であり、最新の結果をすぐに取得することはできません。サーバーがWebサービス機能にASMXを使用していると仮定します。できれば、大幅な見直しをせずに、アプリケーションの効率を向上させるにはどうすればよいですか。

編集1:

課税とは、サーバーがさまざまなSQLテーブルと関連データなどを取得する必要があることを意味します。つまり、多数の同時ユーザーがいる場合、将来サーバーのパフォーマンスに問題が発生する可能性があるのではないかと心配しています。

現在、アプリケーションは要求/応答httpsタイプの呼び出しを使用しているため、最新のデータは取得されません。

モバイルアプリケーション側でさらに改善できますが、サーバー側ではサーバーのWebサービスファイルを除いて多くを変更することはできません。

10
Gene

「伝統的」というのは、すべてのクライアントができる限り頻繁にサーバーをハンマーで打つことを意味するのであれば、私はアーキテクチャレベルで支援できます。

適切な設計は、サーバーがこのグリッドのどこに位置するかによって異なります。

Control \ Resources : Sufficient | Insufficient
Customizable        :     SC     |     IC
Untouchable         :     SU     |     IU
  • SC:サーバーを observer pattern に従います。クライアントがオブザーバーとして登録できるようにします。

  • IC:プロキシシステムのみがサーバーに登録できるようにします。クライアントはプロキシに登録します。

  • SU:プロキシシステムのみがサーバーをポーリングできるようにします。クライアントはプロキシに登録します。

  • IU:プロキシシステムのみがサーバーをポーリングできるようにします。クライアントはプロキシに登録します。

オブザーバーパターンに従うプロキシは、カスタマイズとリソースの両方の問題を解決できます。これは、オブジェクト間で行われるのと同じように、インターネットを介して同様に機能します。登録すると、何かが発生したときに呼び出されるように求められます。ポートをリッスンすると、呼び出す準備が整います。 ajax、REST、UDPなど。

ポーリングの問題は、オブザーバーが呼び出しが発生するタイミングを制御しているが、状態がいつ変化するかを認識していないため、多くの不要な呼び出しを行うことです。これは特にオブザーバーが多い場合にリソースを消費します。ポーリングを処理するための鍵は、できるだけ早く、状態の変化点からオブザーバーへの呼び出しの方向を取得することです。その後、必要なときに呼び出しが行われます。そうでない場合はそうではありません。

この方法でポーリング呼び出しを行う場合:

  • サーバー<===多くのオブザーバー

これらはどれも、変更を検出するためのより良い方法です。

  • SC:サーバー===>多くのオブザーバー

  • IC:サーバー===> 1つのプロキシ===>多くのオブザーバー

  • SU:サーバー<=== 1つのプロキシ===>多くのオブザーバー

  • IU:サーバー<=== 1つのプロキシ===>多くのオブザーバー

10
candied_orange

ポーリングの代わりに Server-Sent-Events を使用できます。

サーバーにn秒ごとに新しいデータを要求する代わりに、専用接続を開いて、新しいデータが利用可能になったときにサーバーに送信してもらいます。

接続は、クライアントまたはサーバーによって(またはそれらの突然の終了によって)明示的に閉じられるまで開いたままになります。

一定の間隔で、またはサーバーで特定の時間にデータをクライアントにブロードキャストするようにサーバーを設定できます(オブジェクトの状態が変化したとき、またはスケジューラーがジョブを起動したとき、またはになったとき)。

さまざまなイベントタイプを定義し、さまざまなルーチンでさまざまなイベントタイプを処理できます。

サーバー側では、アプリケーション/イベントタイプに現在サブスクライブしているユーザーのキューを保持できます。イベントが作成されると、サーバーはそれをキュー内のすべてのユーザーにブロードキャストします。 Jersey2のようなフレームワークはBroadcasterオブジェクトを使用してこのアプローチをすでに実装しています

クライアント側では、 特定のURLでサーバーが送信したイベントをリッスンするサービス を記述する必要があります。

州/ルートを入力するときは、サーバータイプをサブスクライブし、リークを回避するために$destroyでサブスクライブを解除する必要があります。

6
svarog

それらはWebソケットです:それらはHTTPの拡張であり、同じポートで動作します。

クライアントとサーバー間の双方向通信を可能にします。もちろん、そのために使用できるangularjs統合があります。

それ以外の場合、バックオフィス側で、JavaのSpringを見ると、他の方法で実行できます。

  • ロングポーリング
  • ストンプ
  • ...

この link covevr websocketと、必要に応じて調整された他のメソッド。

Spring/Javaがない場合でも、それを読んで、テクノロジのスタックで同等のソリューションを検索する必要があります。

3
Walfrat

「かなりの課税」などをより適切に定義し、最新の結果がすぐに取得されない理由を探る必要があります。これらは、クライアントからポーリングしているかどうかに関係なくおそらく発生している質問です。

つまり、ブラウザベースのフロントエンドでは、ネイティブJavaScriptを使い続けたい場合、基本的に2つのオプションがあります。ポーリング(実行中、または場合によってはロングポーリング)またはWebソケットです。私はこれまでASMXでWebソケットが実行されるのを見たことはありません(実行できないと言っているわけではありません。そこでは経験がないため、再実装するのがどれほど難しいかわかりません)。さらに、パフォーマンスや精度の問題がある場合は、前述のように、Webソケットを使用しても問題が解決しない場合があります。

1
Paul