3

友人と私は、jQuery と PHP コアを備えた Web ベースの AJAX チャット ソフトウェアを構築しています。これまで、2 秒ごとにサーバーを呼び出して更新を探すという標準的な手順を使用してきました。ただし、この方法は高速ではなく、データが返されなくてもサーバーとの間で大量のリクエストがやり取りされるという点で「費用対効果が高い」という理由から、この方法は嫌いになりました。

私たちのプロジェクト サポーターの 1 人は、COMET として知られる手法、より具体的にはロング ポーリングを検討することを勧めました。しかし、さまざまな記事やブログ投稿でそれについて読んだ後、Apache サーバーで使用する場合はそれほど実用的ではないことがわかりました。ほとんどの人は「それは良い考えではない」と言うだけのようですが、Apache が一度に処理できるリクエスト数の詳細についてはあまり触れていません。

PureChat の全体的な目的は、見栄えが良く、高速で、ほとんどのサーバーで動作するチャットを人々に提供することです。そのため、ユーザーの約 96% が Apache を使用し、長いポーリングにより適していると思われる Lighttpd や Nginx を使用しないと想定しています。

ポイントに到達する:

setInterval を使い続けて、新しいデータを繰り返し要求する方が良いと思いますか? それとも、ほとんどのユーザーが Apache を使用するという事実にもかかわらず、ロング ポーリングを使用する方がよいのでしょうか? また、Apache サーバーがロールオーバーして停止するまでにチャットを使用できるおおよその人数について、より具体的な要約を取得することは可能ですか?

4

1 に答える 1

2

Andrew が述べたように、ソケット接続はサーバーとの非同期通信の究極のソリューションですが、現時点では最先端のブラウザーのみが WebSocket をサポートしています。socket.io は、ブラウザがサポートしている場合は WebSocket 接続を開始するオープン ソース API であり、ブラウザがサポートしていない場合は Flash の代替にフォールバックします。ただし、これは API を使用するコーダーには透過的です。

ソケット接続は、基本的にブラウザとサーバー間のオープンな通信を維持し、いつでも相互にメッセージを送信できるようにします。ソケット サーバー デーモンは、接続されたサブスクライバーのリストを保持し、サブスクライバーの 1 つからメッセージを受信すると、すぐにこのメッセージをすべてのサブスクライバーに送り返すことができます。

ただし、ソケット接続の場合は、サーバー上で常時稼働しているソケット サーバー デーモンが必要です。これはコマンド ライン PHP (Apache は必要ありません) で実行できますが、非ブロッキングのサーバー側 JavaScript API である node.js などに適しています。

node.js は、あなたが話していること、長いポーリングにも適しています。基本的に、node.js はイベント ドリブンでシングル スレッドです。これは、多くのスレッドを開かなくても、多くの接続を開いたままにしておくことができることを意味します。これにより、大量のメモリが消費されます (Apache の問題)。これにより、高可用性が可能になります。ただし、覚えておく必要があるのは、Nginx のようなノンブロッキング ファイル サーバーを使用していたとしても、PHP には多くのブロッキング ネットワーク呼び出しがあるということです。単一のスレッドで実行されているため、各 (たとえば) MySQL 呼び出しは、その MySQL 呼び出しに対する応答が返されるまで、基本的にサーバーを停止します。これが発生している間は他に何も行われず、非ブロッキング サーバーが役に立たなくなります。ただし、ネットワーク呼び出しに JavaScript (node.js) などのノンブロッキング言語を使用した場合、これは問題になりません。

長いポーリングの場合、基本的にリクエストを送信すると、サーバーは応答するまで 50 秒待機します。報告するものがある場合は 50 秒以内に応答し、それ以外の場合は待機します。50 秒後に報告するものが何もない場合は、ブラウザがタイムアウトしないように応答を送信します。応答によってブラウザが別の要求を送信するようになり、プロセスが最初からやり直されます。これにより、要求が少なくなり、応答が速くなりますが、ソケット接続ほど良くはありません。

于 2012-05-08T17:22:57.787 に答える