0

ある種のリアルタイム更新を行う Web サイトを開発しています。これで、データセットの現在の ID の JavaScript 変数を使用して Web サイトが生成されます。次に、数秒間隔で AJAX 呼び出しが行われ、現在の ID が渡されます。新しいものがある場合、サーバーは最新の ID と共にそれを返し、JavaScript で更新されます。非常に単純ですが、ここで問題が発生します。

ユーザーが同じページを複数回開くと、すべてのページがこの AJAX 要求を実行し、サーバー負荷が高くなります。

今、私は次のアプローチについて考えました:

Web サイトには、現在のタイムスタンプと現在のデータセットの ID の JavaScript 変数が読み込まれます。私の希望するリフレッシュ間隔は、たとえば 3 秒です。

Web サイトでは、インターバル カウンターが 1 秒ごとにカウントアップし、タイムスタンプが(timestmap % 3===0)true を返す状態になるたびに、コンテンツが更新されます。リンクはhttp://www.example.com/refresh.php?my-revision=123×tamp=123456のようになります

これで、すべてのブラウザ ウィンドウが同じ URL を呼び出すようになります。次に、ブラウザ レベルのキャッシュを有効にします。

しかし、私はこの解決策があまり好きではありません。Cookie にデータ共有の別のレイヤーを追加することをお勧めします。これは大きな問題ではありません。すべてのリクエストを、タイムスタンプとデータ リビジョンで名前を付けた Cookie に 10 秒程度の TTL で保存し、最初にその存在を確認するだけで済みます。

しかし

ページは同時にリクエストを実行します。そのため、ブラウザのキャッシュと Cookie のロジック全体が機能しない可能性があります。これは、リクエストが次々にではなく同時に発生するためです。

そこで、現在の接続を 1 つのサーバー側に制限することを考えました。しかし、ページ全体でそれをしたくないので、少なくとも追加の vhost が必要になります。これにより、クロスサイト ポリシーに関する問題が発生します。

もちろん、いくつかの非常に複雑な負荷分散ソリューション/URI や IP アドレスなどを要求するサーバー側のソリューションがありますが、それはすべて極端にやり過ぎです!

それはよくある問題に違いない!Facebookのチャットを考えてみてください。あなたが開いているすべてのウィンドウですべてのリクエストを行うとは本当に思いません...

何か案は?私は本当にこれにこだわっています!

ウィンドウ間の Javascript 通信を行うことはできますか? すべてが同じドメイン上にある場合は問題になりませんか?

もちろん、私ができることはサーバー側のキャッシュです。これにより、少なくともDB接続と集中的な計算が回避されます...しかし、それでも避けたい要求です。

4

2 に答える 2

2

CometOrbitedをチェックしてみてください。これは、サーバー プッシュ テクノロジで最もよく解決されます。

于 2010-09-19T13:24:52.763 に答える
1

まず、MemcacheRedisなどを使用して、サーバー側のキャッシュを実行します。したがって、要求を実行する3台のマシンに対して防御されます。しかし、あなたはそれを知っていました。

率直に言って、Cookieは正しいと思います(ただし、より最新のオプションについては、以下を参照してください)。Cookieはすべてのウィンドウインスタンスで共有され、簡単にクエリできます。ポーリングロジックは次のようになります。

ポーリング間隔について:

  • コンテンツクッキーを見てください:それはあなたが持っているものより新鮮ですか?もしそうなら、それを使用して、あなたは完了です。
  • ステータスCookieを見てください。他の誰かが積極的にポーリングしていますか(たとえば、Cookieが設定されていて古くない)?はいの場合は、すぐに戻ってきます。
  • ステータスCookieを設定します:私は(現在)アクティブにポーリングしています。
  • リクエストしてください

応答時:

  • 新しいデータがコンテンツCookieの(おそらく更新された)コンテンツよりも新しい場合は、コンテンツCookieを新しいデータに設定します
  • あなたがそれを設定した人なら、ステータスクッキーをクリアしてください

基本的に、ステータスCookieは、どこかで誰かがコンテンツを更新していることをすべてのウィンドウインスタンスに示すセマフォとして機能します。

コンテンツCookieにコンテンツが直接含まれている場合があります。または、コンテンツが大きく、制限に達することが心配な場合は、各ページに一意の名前の非表示のiframeを設定し、Ajaxアップデートで書き込みを行うことができます。 iframeに出力します。コンテンツCookieは、最新のiframeの名前を公開し、新しいコンテンツがあることを確認する他のウィンドウはwindow.open、そのiframeを取得するために使用できます(window.open既存のiframeの名前を使用するとウィンドウが開かないため) 。

競合状態に注意してください。特定のページ内のJavaScriptはシングルスレッドですが(Webワーカーの明示的な使用を除く)、他のウィンドウのJavaScriptが必ずしも同じスレッドで実行されているとは期待できません(一部のブラウザーでは実行され、他のブラウザーでは実行されません)。 、Chromeでは同じプロセスではありません)。また、Cookieの作成に原子性が保証されているかどうかもわかりませんので、注意が必要です。

現在、HTML5はいくつかの便利なドキュメント間通信メカニズムを定義しているため、このCookieアプローチに頼る前に、それらが存在するかどうかを確認して使用することを検討してください。これらは現在の最新のブラウザーでは機能しますが、古いブラウザーでは機能しません。おそらく今すぐ対処する必要があります。それでも、それをサポートするブラウザでは、すばらしいです!

上記の側面として、 Webストレージも調査する価値のあるオプションかもしれませんが、クライアントはほぼ確実にアプリにアクセス許可を与える必要があり、これもかなり新しいことです。

于 2010-09-19T13:42:52.953 に答える