web-dev-qa-db-ja.com

クライアント通知、AJAXプッシュまたはポーリングを使用する必要がありますか?

私は、Webサイトを閲覧しているユーザーにメッセージを配信するために使用される簡単な通知サービスに取り組んでいます。通知をリアルタイムで送信する必要はありませんが、通知が5分ごとと言うよりも頻繁に発生する場合は、ユーザーエクスペリエンスが向上する可能性があります。クライアントとの間で送受信されるデータはそれほど大きくなく、データを取得するための単純なデータベースクエリです。

このトピックに関する他の会話を読むと、AJAX Pushはサーバーの負荷が高くなる可能性があります。サーバーの遅延が長くても許容できるため、サーバーにPush通知を送信するか、単に世論調査。

プッシュシナリオを実装することはそれほど難しくないので、私はここでの意見が何であるかを確認すると思いました。

ご協力いただきありがとうございます。

編集:私はシンプルなAJAXをプッシュして、これに基づいたシンプルなデモを実装しました article Mike Purvisによって実装されました。クライアントの負荷は、初期バージョンであり、かなり長い間その方法を維持すると予想されていました。


皆様のご回答ありがとうございます。私はポーリングソリューションを使用することを決定しましたが、後で変更したい場合に簡単になるように、すべてをユーティリティライブラリ内にラップします。

33
smaclell

プッシュを使用するには、サーバーと各クライアント間で開いているHTTP接続を維持する必要があるため、私も同様にポーリングを行います。サーバーリソースを大量に消費するだけでなく、非常にトリッキーになります。前述のマットbとして実装します。

私のポーリングの経験では、ビジー状態のサイトで十分な頻度のポーリング間隔があると、Webサーバーのログがポーリング要求ですぐにいっぱいになる可能性があります。

編集(2017):今、あなたの選択はWebSocketとロングポーリング(別の回答で言及)のどちらかです。長いポーリングのような音は、通知がリアルタイムで受信される必要がないことを質問が述べる方法に基づいて正しい選択であるかもしれません、頻繁でないポーリング期間は実装するのがかなり簡単であり、サーバーにあまり負担をかけるべきではありません。最近のWebSocketはクールで多くのアプリケーションに最適ですが、この場合はやり過ぎかもしれません。

5
mmacaulay

ここでロングポーリングについて言及した人がいないことに驚いています。ロングポーリングとは、開いている接続をより長い期間(たとえば30〜60秒)維持し、いったん閉じたら、再度開き、ソケット/接続に応答を待機させるだけです。これにより、接続が少なくなり(接続が長くなります)、応答がほとんど即時になります(新しいポーリング接続を待つ必要がある場合もあります)。 NodeJSなどのテクノロジーと組み合わせて追加したいと思います。これにより、非常に効率的でリソースの軽いソリューションが実現します。これは、すべての主要なブラウザーとバージョン間で100%ブラウザー互換であり、Cometや閃光。

これは古い質問であることに気づきましたが、この情報を提供することはまだ役立つと思いました:)

12
Oddman

間違いなくPushをもっとクールに使ってください。単純な通知だけが必要な場合は、 StreamHub Push Server のようなものを使用して、面倒な作業を行います。独自のAjaxプッシュ機能を開発することは、非常にトリッキーで岩の多い道です。すべてのブラウザーで機能させ、ファイアウォールとプロキシを処理して、キープアライブ接続などを破壊する必要があります。なぜ、車輪を再発明するのでしょうか。また、同様にフットプリントが10K未満と低いため、それが優先される場合に適しています。

10
Supertux

どちらにも異なる要件があり、異なるシナリオに対処します。

オンラインチャットのように、リアルタイム更新が必要な場合は、Pushが必要です。

ただし、リフレッシュ期間が大きいの場合(5分)、プールは適切なソリューションです。この場合、Pushはクライアントとサーバーの両方から大量のリソースを必要とします。

Tip!プールをチェックするページを高速かつクリーンにするようにして、各リクエストでサーバーのリソースを大量に消費しないようにします。私が通常行うことは、プールが空であるかどうかを示すフラグを(セッション変数のように)メモリに保持することです。したがって、プールが空でない場合にのみ、プール内を波状に見ます。ほとんどの場合、プールが空の場合、ページ要求は非常に高速に実行されます。

7
Daniel Silveira

簡単に書けるように聞こえるという理由だけで投票を実装します。投票を単純に保つことは非常に価値があります。

3
matt b

現在、この問題を一瞬で解決しようとしているサービス http://pusherapp.com があります。チェックアウトする価値があるかもしれません。 (免責事項:私はそれらに関連付けられていません)。

1
Kirill

私自身は試していませんが、 COMETは機能し、あなたが考えるよりも簡単だと言う人もいます 。 Ruby on Railsプラグインと呼ばれる Juggernaut )もあります。繰り返しますが、使用していないので、YMMVですが、ポーリングと比較して必要なリソースがはるかに少ないことを理解しています。COMETがどのように MacRumorsLive.com WWDC Stevenotesのライブブログを配信します。

1
Andrew Hedges

所有するクライアントの数を知らずに、ポーリングの方がプッシュよりもコストがかかるかどうかを言うのは不可能です。ポーリングをお勧めします:

  • 1分に1回程度データを更新したいようです。通知がそれよりもはるかに速い速度で届かない場合を除いて、プッシュとは、HTTP接続を開いたままにしていても、HTTP接続のアクティビティがほとんどないことを意味します。
  • ポーリングは既存のHTTP規則に基づいて構築されているため、Webブラウザーと通信するサーバーはすべて、通常のAjax要求に応答する準備ができています。コメットまたはフラッシュソケットベースのソリューションには、さまざまな要件があります。サーバー側にcometdのようなものが必要で、サーバー側のプッシュを実行するクライアント側のライブラリが必要です。

そのため、データの急流とクライアントの大量の負荷を管理するために何か重いものが必要な場合は、Cometをお勧めします。しかし、そうではないようです。

1

いくつかのCOMET実装を調べたかどうかはわかりません(つまり、AJAX Push)の意味です)。

ユーザーがサイトをサーフィンしている場合、この通知がサーバーに情報を要求しているのではないでしょうか。

1
Lou Franco