これは、「まだありますか?」と継続的に尋ねるJavaScriptの単純なケースです。車の運転で4歳のように..しかし、親のように、これを頻繁に行うか、一度に多くの子供がいる場合、サーバーは圧力を受けて座屈します。
5秒ごとに新しいコンテンツを検索し、より多くの訪問者を許可するWebページがあるという問題をどのように解決しますか?
これは、「まだありますか?」と継続的に尋ねるJavaScriptの単純なケースです。車の運転で4歳のように..しかし、親のように、これを頻繁に行うか、一度に多くの子供がいる場合、サーバーは圧力を受けて座屈します。
5秒ごとに新しいコンテンツを検索し、より多くの訪問者を許可するWebページがあるという問題をどのように解決しますか?
stackoverflowはそれを何らかの方法で行いますが、方法はわかりません。
より標準的な方法は、実際、数秒ごとに新しいコンテンツを検索するjavascriptです。
より高度な方法では、 Cometテクニック(ロングポーリングなど)を使用して、プッシュのようなテクニックを使用します。そのリンクの下にはたくさんの興味深いものがあります。
私はまだそれを自分で使う良い機会を待っています...
ああ、それについてのstackoverflowからのリンクは次のとおりです:
Webサーバーからブラウザにデータをプッシュする方法はありますか?
Javaでは、Cometテクノロジーを使用してAjaxライブラリ(DWR)を使用しました。これを使用してPHPでライブラリを検索する必要があると思います。アイデアは、サーバーが1つの非常に長いHttp応答を送信し、クライアントに送信するものがある場合、サーバーはそれを終了し、更新されたデータで新しい応答を送信するというものです。クライアントを使用すると、新しいデータを取得するためにx秒ごとにサーバーにpingを実行する必要はありません。役立つと思います。
クライアントの数に応じてポーリング時間を可変にすることができます。あなたの比喩を使って、子供は「私たちはまだそこにいますか?」と尋ねます。ドライバーは「いいえ、でも1時間以内に」と答えます。ありがたいことに、Javascript は頑固な子供ではないので、それまでは彼に悩まされることはないと確信できます。
最初は 5 秒ごとにポーリングすることを検討できますが、しばらくしてからポーリング間隔の時間を増やし始めます。おそらく上限 (1 分、5 分など、使用に最適と思われるもの) までです。増加は線形である必要はありません。
より洗練されたスピン (クライアントの数によって異なるという monzee の提案を組み込むことができます) は、サーバーが次のポーリングまでの間隔を指定できるようにすることです。その後、サーバーは時間の経過とともに間隔を増やすことができ、その場で、またはネットワーク負荷に応じてアルゴリズムを変更することもできます.
Pythonの「Twisted」フレームワークを見ることができます。それはあなたが探しているものを満足させるかもしれないイベント駆動型ネットワークプログラミングフレームワークです。サーバーからメッセージをプッシュするために使用できます。
おそらく、実際のdb-queryを作成する必要はなく、単純なタイムスタンプのみを使用して新しいものがあるかどうかを判断する、実際の単純なスクリプトにクエリを送信できます。
そして、答えが真の場合、サーバーが実際の作業を行わなければならない実際のクエリを実行できます!-)
このアプローチは、サーバー側のソケットとクライアント側の ajax/comet の組み合わせに基づいていると思います。お気に入り:
複数のユーザーがログオンしているチャット アプリケーションがあり、それぞれがサーバー側のリスナー スクリプトへの低速ロード AJAX 呼び出しを介してリッスンしているとします。
入力されたばかりのデータを取得するブラウザーは、ライター スクリプトへの ajax 呼び出しを使用してサーバーに送信します。そのサーバーは、データベース (またはストレージ システム) を更新し、ソケットの書き込みを通知されたリスナー スクリプトにポストします。後者は新しいデータを取得し、それをクライアント ブラウザに送り返します。
今、私はまだこれを書いていません.2つの同時接続というブラウザの制限が上記のロジックを台無しにするかどうか、またはどのように台無しにするかはわかりません。
ここで考えている人から聞いていただければ幸いです。
なので
DB を呼び出す単一のインスタンスがあり、新しいタイムスタンプが存在する場合は、その新しいタイムスタンプをアプリケーション変数に入れます。次に、すべてのセッションでそのアプリケーション変数をチェックします。またはそのようなもの。そうすれば、1 つのインスタンスだけが sql-server を呼び出し、クライアントの数は問題になりません。
私はこれを試したことがなく、頭のてっぺんにある最初のアイデアにすぎませんが、タイムスタンプをキャッシュし、クライアントにキャッシュをチェックさせることがそれを行う方法であり、キャッシュを実装する方法(sql-server-cash、アプリケーション変数など)何が最善かわかりません。
SO がどのようにそれを行うかについては、「あなたの回答」ボックスに入力しているときにのみ、新しい回答を継続的にチェックしないことに注意してください。
その場合の鍵は、実際に変更を取得するためのより高価なプロセスを開始する前に、一般的な「更新が不要」なケース (たとえば、新しい回答の入力やタイムスタンプのチェック) を除外するために、最初に計算コストの低い操作を実行することです。
または、アプリケーションによっては、変更発行メカニズムを最適化することでこれを解決できる場合があります。たとえば、変更 (またはそれらの要約) を RSS フィードに載せて、クライアントに実際のアプリケーションの代わりにフィードを監視させることが実現可能かもしれません。RSS が設計され、最適化されているのとまったく同じ種類のものであるため、これはかなり効率的であると想定できます。さらに、追加のコストをほとんどまたはまったくかけずに、アプリケーションを世界の他の地域との相互運用性を大幅に高めるという追加の利点があります。あなた。