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


10

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

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

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

編集1:

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

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

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

回答:


10

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


7
「怠惰な修正」シナリオを見逃しました。パーティ間に軽量のプロキシを配置し、どこでもポーリングを続けるだけです。主なパフォーマンスの問題は、サーバーが各クエリで多くの複雑な作業を実行していることが原因と考えられます。レートスロットルプロキシ(nginx、memcached、インメモリLRU構造など)を使用することで、各JavaScriptクエリでサーバー側の計算を呼び出さずに応答率を向上させることができます。
user1643723

@CandiedOrange、オブザーバーに関しては、SignalRのようなものでしょうか。
ジーン

@Geneの誇大広告が信じられるなら、そうです。彼らは同じことを話している。
candied_orange

6

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

サーバーにn秒ごとに新しいデータを要求する代わりに、専用接続を開いて、新しいデータが利用可能になったときに送信するようにしてください!

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

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

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

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

クライアント側では、特定のURLでサーバーから送信されたイベントをリッスンするサービスを作成する必要があります

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


こんにちはsvarog、サーバー送信イベントを使用してマルチキャストを実現できますか?、Jesey 2以外に他のクライアント実装が利用可能ですか?、SSEイベントをサブスクライブできるhttp2クライアントを探しています。
kapil das

3

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

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

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

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

このリンク covevr websocketと必要なものに適応した他の方法。

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


サーバーが同時に処理できるオープンソケット接続の最大数はいくつですか?WebSocketはスケーラブルですか?
thewebjackal

それがわからないこと、それを負荷分散できるものがある可能性が非常に高いですが、それはわかりません。
Walfrat

1

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

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


こんにちはplsは更新を見ます!
Gene
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.