2009-03-24 24 views
11

私は基本的な少しのAJAX shoutbox/chatを自分のウェブサイト用に構築していますが、サーバーのポーリングを実装する方法は正確にはわかりません。ここでJavaScriptチャットクライアントのサーバーポーリング間隔

は私が考えている基本的なプログラムの流れです:

  1. ユーザーがページに来て、他の人から送信されたメッセージを取得するには、最後の10件のメッセージ
  2. を示され、クライアントはJavascriptをしてURLを要求しますタイムスタンプパラメータ(クライアントが最後に受信したメッセージの値に設定されます)
  3. サーバは、タイムスタンプからすべてのメッセージ(最大10まで)を返します。

唯一の問題は、サーバーをポーリングする頻度です。明らかに新しいメッセージが追加されるたびにポーリングする必要がありますが、他人のメッセージを読むときには自動的に更新する必要があります。

設定期限はありますか?例:10秒ごと。それとも、それは用途によって異なるのでしょうか?例:5秒後に確認します。メッセージがない場合は、さらに10秒間チェックしないでください。まだ新しいメッセージがない場合は、15秒後にチェックを入れ、20秒後に30秒ごとに1回チェックします。新しいメッセージが検出されるたびに、タイマーを5秒間にリセットしてもう一度開始してください。

私は、オンラインで数百人のユーザーを同時に抱える可能性があることを考慮して、サーバーに不必要な負荷をかけることを心配しています。

...全部が間違っていますか?基本的なjavascriptチャットを実装するためのより良い方法はありますか?

答えて

4

Brianが記述したCometは素晴らしいテクニックですが、サーバー上でセッションをサポートする必要があります。これは、単純なチャットボックスに実装するよりも高度なものです。

ポーリング間隔を実装する最善の方法は、チャットウィンドウを持っていることを想像して他のことを最小限に抑えたり、新しいメッセージがあるかどうかを確認したりできます。あなたが会話の途中にいるときは、頻繁に(投票)に切り替えます。しばらくの間メッセージが表示されない場合は、時々チェックするまで希少度の高いレアを探し始めるでしょう。

リアルタイムタイピングを行う必要がないと仮定すると、ピーク時には3秒ごとにポーリングを行い、5〜10回のポーリングでは何も表示されない場合は、 30秒~60秒に達するまで毎回それを2倍にする)。メッセージを返すと、ポーリング間隔が数秒にリセットされるはずですが、メッセージを送信すると即座にポーリングする必要がありますが、それ以外の場合はポーリング頻度を有効にする必要はありません。

+0

これは、尋問者が概説したものです。あなたはその質問全体を読んだことがありますか? –

+0

私は重要な点は、成功した更新と不必要な更新の微妙な明確化です。チャットの例では、新しいチャットがある場合、それはアクティビティを示し、ポーリング間隔は短い間隔にベースラインを設定する必要があります(正帰還ループ)。ポーリングが行われ、新しいチャットがない場合、次のチャプターの間隔が増える(負帰還ループ)必要があります。私はそれがポーリングを扱う非常に強力で効率的な方法のためだと思います。 – Kzqai

0

5秒ごとに他のユーザーが入力しているかどうかを確認してください。他のユーザーが入力している場合は、1秒ごとに確認して、ユーザーが新しいメッセージを送信したかどうか確認できます。実際には、1秒ごとに確認して、他のユーザーが入力しているかどうかを確認し、25秒ごとに新しいメッセージが送信されているかどうかを確認する必要があります。ブロードバンドがinetで一般に受け入れられているので、問題ではありません。ポーリングタイムアウトが長くなるとダイヤルアップアクセスが可能になります。

+0

何百人もの人がいるかもしれません。また、ユーザーが入力を開始したときだけでなく停止するときに、各クライアントがリクエストを送信する必要がありますか? – nickf

+0

これはAJAX XMLHTTPRequestオブジェクトのために設計されたAJAXでは真です。 – Suroot

+0

ここに二重の投稿を残して申し訳ありませんが、この情報をそこに入れたいと思っていました:http://en.wikipedia.org/wiki/Comet_(programming)#XMLHttpRequest – Suroot

5

クライアントがサーバーにポーリングするのではなく、ユーザーに情報をストリーミングするプログラミング手法として、Cometと呼ばれるものを調べるとよいでしょう。これは実際には技術のファミリであり、使用しているサーバーの種類や必要なクライアントの互換性など、状況によってはいくつかの機能が他より優れている場合があります。

サーバが一度に多数の開いている接続を処理できる場合(たとえば、nginxerlangベースのサーバなど、接続ごとにスレッドまたはプロセス全体を使用しない場合)は、 1つのメッセージが受信されるとすぐに、クライアントはすぐに別のメッセージを要求します。利用可能なメッセージがない場合、単にメッセージが利用可能になるまで、サーバは接続を開いたままにし、場合によってはダミーのデータをキープアライブとして送信します。

0

これは非常に難しい質問です。慎重に考えてください。悪意のあるユーザーはできるだけ頻繁にヒットし、最も早いタイムスタンプは偽造され、DBサーバーにストレスを与えます。とにかく誰もが同じ時間にするべきではないので、タイムスタンプを検証するか、無視してください。

ポーリング間隔は、他のユーザーの応答時間の関数としてユーザーに送信できます。それは私が考える最高のダイナミックなものです。

+0

私はそれを考えました - 私は最新の10メッセージは与えられたタイムスタンプ以来、誰かがそれを "0"に変更しても、彼らはちょうど最後の10のメッセージを得るでしょう。 – nickf

+0

タイムスタンプを使用しないでください。クライアントにトークンを発行しないでください。トークンを使用してメッセージをマークすると、新しいトークンを作成したメッセージを要求したときに、新しいメッセージを最新のトークンでマークします。 –

3

あなたが実装している場合は正直なところ、「基本小さなAJAXの一言ボックスを/チャット」、JabberCometなどのようなものは、あなたのために行き過ぎです。これらの機能を利用するには、アプリサーバーとdbの負荷を軽減するために、追加の サーバー/プロキシを実行する必要があります。
presence management(「Joeはタイプしています...」)のようなものを考えると、あなたのアプリのために過度に複雑になります(「チャット」はあなたの主な焦点ではないと考えます)。
MeeboUserplaneなどのプロバイダからウィジェットを追加することを考えてみましょう。いったんあなたはジャバー(Jabber)などについて考える。

+0

実際、これは実際には最も基本的な機能であると考えられています – nickf

0

http://jabbify.com/home/comet_service これは、jmvcフレームワークをやった人たちによる無料の彗星ベースのチャットサービスです。それをまだ試していないが、有望に見える。