3

背景
私は、ロングポーリングをサポートするトルネードのようなサーバーを使用しています。ユーザーが新しい Web ページにアクセスするたびに、次のようなサーバーへの長いポーリングが設定されます。

$.ajax({
    type: 'GET',
    url: "/mylongpollurl/",
    dataType: 'application/json',
    success: function(json) {
        // I do stuff here
    },
    error: function(xhr, errText, ex) {
        // If timeout I send a new long-poll request
    }
});

問題
ここで、ブラウザから行われたすべてのリクエストを監視する Fiddler から取得したデータに依存します (現時点では FF)。

  1. ページ 1 が読み込まれ、ロング ポール リクエストが行われ、サーバー側でアイドル状態になります。
  2. ページ 2 へのリンクをクリックすると、そのページが読み込まれ、長いポーリング リクエストが設定されますが、ページ 1 からの長いポーリング リクエストはサーバー側でまだアイドル状態です (Fiddler によると)。

これは、ページをクリックするとすべての長いポーリング呼び出しがスタックされることを意味し、サーバー上で多くのアクティブな接続が発生します (または、接続を共有している可能性がありますか?)

私の考え
- これはトルネードのようなサーバー (epoll を使用) であるため、かなり多くの接続を処理できます。しかし、この事実は私の意見では悪用されるべきではありません。私が言いたいのは、この場合 (クライアントが消えた場合) にサーバーにタイムアウトを設定したくないということです。
- これらの独立したページは、共通のヘッドを使用し、ajax 呼び出しを介してのみコンテンツを交換することを知っていますが、今日使用するこの設計は私の呼び出しではありませんでした...
- これを解決する最善の方法は、おそらく接続を再利用することです (やってのけると思います) またはブラウザがページを離れるとすぐに閉じます (クリックして別のページに移動します)。

ありがとう
-- MyGGaN

4

1 に答える 1

4

ロングポーリング接続の場合、Fiddler 内で「ストリーミング」オプションが設定されていることを確認する必要があります。そうしないと、Fiddler は接続を開いたままにして、応答が完了するまで無期限に待機します。

通常、ページからページに移動するとき、クライアント開いているロング ポール接続を破棄し、接続を事実上閉じる必要があります。たとえば、IE でポップアップ ウィンドウを閉じたときなど、これが常に正しく機能するとは限らないためです

于 2009-10-06T02:26:01.183 に答える