web-dev-qa-db-ja.com

Ajax vs Socket.io

私はWebアプリを開発していますが、どの方法が私のプロジェクトに適しているのか疑問に思いました。

基本的に私がユーザーに表示したいのは、他のサーバーへのリクエストから取得されるいくつかの通知です。私のnode.jsアプリはすべての情報を取得し、それをユーザーに拡散して、コピーをMongoDBに保存します。

アイデアは非常に単純ですが、方法について読んで、次の2つの手法を見つけました。

  1. Ajax:クライアント側は、サーバーに新しいコンテンツがあるかどうかを常にチェックします。これは、jquery ajax get to my server APIを使用して実行されます(30/60秒ごと)。

  2. Socket.io:クライアントは一度接続すると、永続的なTCP接続が維持されます(よりリアルタイム)。


今、私は状況を説明しました、私は次の質問があります:

  • Ajaxでリクエストが多すぎないでしょうか?サーバーに対して毎分チェックが必要だと想像してください。アプリを100ユーザーにスケーリングすると、毎分100クエリが返されます。ソケットを持つことは、システムリソースで「安い」でしょうか?

  • Socket.ioはモバイルデバイスにとって問題になりますか?帯域幅とパフォーマンス。サーバーの応答は常にJSON形式の情報です。

  • Now.jsを使用できると読みましたが、プロジェクトはサポートされなくなったようです。そのため、使用するのがよいかどうかはわかりません。

  • 両方の方法でのキャッシュはどうですか?ユーザーごとにキャッシュファイルを作成することを検討していましたが、これはサーバー側のnode.jsによって更新されます。これはajaxで本当にうまくいくと思いますが、socket.ioはどうですか?

  • Socket.ioが多くのブラウザとまったく互換性がないというのは本当ですか?私のアプリはモバイルデバイスに焦点を当てているので、代わりにajaxを選択することを考えさせることができると思います。

  • 提案された代替案はありますか?

これが私の心と同じ状況にある他の人をクリアできることを願っています:)ありがとう

11
themazz

WebSocketとAjaxの間の一般的なトレードオフの多くは、ここで説明されています。

リアルタイムデータ用のWebSocketとREST API?

ここでは、モバイルデバイスのトレードオフの問題について説明します。

Cordova:Sockets、PushNotifications、またはサーバーの繰り返しポーリング?

簡単に言うと、データが主にサーバー駆動型であり、クライアントに送信する必要があり、クライアントが新しいデータを確認するまでの待ち時間をかなり長くしたい場合、それがwebSocketの問題です。 webSocketsは、クライアントが頻繁にポーリングする必要がなく、サーバーが多くのクライアントからの定期的なポーリング要求を処理する必要がないため、この状況で最適に機能します。代わりに、各クライアントは1つの永続的なwebSocket通信チャネルを設定するだけで、サーバーはいつでも要求に応じてデータを送信できます。

Ajaxでリクエストが多すぎないでしょうか?サーバーに対して毎分チェックが必要だと想像してください。アプリを100ユーザーにスケーリングすると、毎分100クエリが返されます。ソケットを持つことは、システムリソースで「安い」でしょうか?

ソケットは、アクティブでないときはほとんどリソースを必要としないため、そうです。永続的なwebSocketは、無限にポーリングする多くのクライアントよりも効率的です。これが、webSocketがこの特定の問題の解決に優れているために発明された理由です。

Socket.ioはモバイルデバイスにとって問題になりますか?帯域幅とパフォーマンス。サーバーの応答は常にJSON形式の情報です。

socket.ioは、帯域幅やパフォーマンスの問題ではありません。モバイルデバイスもアクティブな電源管理を行おうとしているため、バックグラウンドでwebSocketを使用しようとすると、モバイルの問題がいくつか発生しますが、クライアントのポーリングにも同様の問題が存在します。

両方の方法でのキャッシュはどうですか?ユーザーごとにキャッシュファイルを作成することを検討していましたが、これはサーバー側のnode.jsによって更新されます。これはajaxで本当にうまくいくと思いますが、socket.ioはどうですか?

キャッシングについて何を求めているのか不明ですか? webSocketの実装では、サーバーはデータを取得し、それを各ユーザーに送信するだけです。通常、サーバー側のキャッシュは必要ありません。クライアントのAjaxポーリングの実装では、サーバーはデータをどこかに保存し、各クライアントがデータを要求するのを「待機」する必要があります。 webSocketとAjaxのどちらにも「組み込み」のキャッシュメカニズムはありません。

Socket.ioが多くのブラウザとまったく互換性がないというのは本当ですか?私のアプリはモバイルデバイスに焦点を当てているので、代わりにajaxを選択することを考えさせることができると思います。

socket.ioは、IE9以前を除いて、現在使用されているほとんどすべてのWebSocketを備えたすべてのブラウザーと完全に互換性があります。 socket.ioライブラリを使用する場合、webSocketが存在しないと、自動的にロングポーリングにフォールバックします。モバイルデバイスは長時間実行されているものの電源管理を望んでいるが、ポーリングを停止したくないため、定期的なポーリングを行っているかwebSocketを行っているかにかかわらず、モバイルの問題は同様になる可能性があります。これがwebSockets/socket.ioを避ける理由ではないと思います。 socket.ioには、接続が失われるたびに非常に便利な自動再接続ロジックがいくつかあります。

モバイルの世界では、デバイスのネイティブの「プッシュ」システムにプラグインできる何らかのネイティブアプリコンポーネントを使用しないと、バックグラウンドでリアルタイムの通知を確実に実行できないことに気付くと思います。これは、バッテリー効率が高く、電源管理と完全に互換性がある唯一のシステムです。 Webページは、フォアグラウンドタスクではなくなるか、デバイスがアイドル状態になるとすぐに電源管理されます。

17
jfriend00