2009-07-20 10 views
6

サーバーレスポンスに基づいてページを更新するAJAXアプリケーションがあります。 AJAXサーバーの応答が基づいているコマンドは、完全な応答を生成するのに時間がかかりますが、計算されるとすぐに部分的な情報を送信します。この部分応答/部分情報は「バースト」で送信され、各バーストの時間およびサイズは予測不可能である。ウェブブラウザ(AJAXリクエスト)にコマンド出力をストリームするCGIスクリプト(Perl版)は、自動フラッシュがオンになっています。AJAXでのインクリメンタルサーバーレスポンス(JavaScript)

サーバの応答は外部コマンドの出力に基づいています。 'time cmd |/dev/null'は平均で約10.0秒ですが、 'time cmd | head>/dev/null'は0.1秒未満です(例えばデータ)。 。

client |  | server 
---------  --------- 

request -\ 
      \ 
      \ 
      \ 
      \-> 

      /- response 
      / . 
     /  . 
     //- . 
     <-// . 
     /  . 
     //- [end] 
     <-//
     /
     /
     <-/ 

私はこの問題に関するいくつかの質問を持って

注:サーバ側として行われる。以下(アスキーアート図は以下の)が同じような状況が見え

PerlのCGIスクリプトです。私は(また)あなたがいなくても解決したいと思うでしょうjQueryのようなJavaScriptライブラリ/フレームワークを歌います。

  • AJAXアプリケーションのサーバー側で使用されるコマンドの出力は、行ベースです。 1つの定義された種類の行から始まり、他の種類の行で終わる各行のグループは、独立したデータと変更できないデータで構成されます。コマンドのレスポンスを 'text/plain'としてストリーミングしてJavaScriptでクライアント側で処理するか、サーバー上のデータを前処理して、JSONとして 'application/json' mimetypeを使用してデータ全体を送信すべきですか?

  • サーバによって一度に送信される大きなデータチャンクのすぐ後に、別のデータがすぐに続くことがあります。前の呼び出しが完了していない間にonreadystatechangeハンドラが呼び出されたときの対処方法セマフォーとしてグローバル変数を使用するか、ハンドラーパラメーターとして状態変数を渡すべきですか(よく、xhr.onreadystatechange = function() { handleRequest(xhr, state) }を使用します)?

  • 「text/plain」または「application/json」、または「multipart/x0mixed-replace」を使用する必要がありますか?注:このアプリはどのブラウザでも動作します。

  • 完全な応答を受信した後でのみ、onReadyStateChangeを呼び出すWebブラウザ(JavaScriptエンジン)を処理する方法(xhr.readyState == 3、つまり部分応答が2回以上表示されない)さて、いくつかのJavaScriptフレームワークの使用の横にあります。

  • 不完全な応答(この場合、不完全な行を意味します)を処理する方法。

  • レスポンスの終了マーカーを送信するか、カウンタを使用してすべてのデータを受信したかどうかを確認するか、単にxhr.readyState == 4の検出に頼ることができますか?

部分的な応答も役立ちます。

答えて

0

私はクライアント側がすべてのデータが供給されるまで繰り返されるAJAXリクエストを送信してチャンク内のデータを処理するように設計できると思います。これは、たとえ応答全体が大きかったとしても、各チャンクがタイムリーに(クライアント側のタイムアウトの問題なしに)送信できることを前提としています。この設計は、ブラウザーごとに異なる可能性のある特定の部分応答状況のチェックを作成するよりも簡単です。

サーバー側とクライアント側のどちらを処理するかは、たとえば、あなたがサービスする必要がある同時クライアント数、およびいずれかのレスポンスにキャッシュを使用できるかどうか。クライアントがたくさんいるシナリオでは、処理負荷の一部を(それらを処理できる限り)分別する方がよいでしょう。

+1

繰り返しAJAXリクエスト(ロングポーリング戦略)の問題は、_single_コマンドによってデータが生成されるため、AJAXのサーバー部分がクライアント/パスの状態を保存して以降のリクエストを送信する必要があります。 –

1

私はCometがあなたのソリューションに必要なものだと思います。あなたはさらに(もし私がそうであれば)Dojo Foundationによって実装されたBayeux Protocolをチェックアウトすることができます。 すべてのことはまだ非常に新しいです(最初のHTML5実装では可能かもしれませんが)。

さらに、ポーリングのアプローチを実装する必要があります。もう1つの問題は、クライアントサイドのJavaScriptインタプリタが処理できるデータの量です。何らかの理由でデータを「ページング」する可能性はありますか?そうすれば、他の応答がすでに入っている間に依然として処理を処理する要求の問題は発生しません。