0

ポーリングの概念はかなりよく理解していると思います。基本的にはサーバーにデータを要求するだけですが、データが変更された場合にのみ、サーバーはデータを返します。簡単なもの。私の問題はこの例にあります。

絶えず変化するデータを使ったオークションがあるとしましょう。このデータの中には次のようなものがあります

  • オークション終了時間
  • オークションに参加している現在の入札者の数

私が長い投票を始めるとき、私は基本的に次のようなものを持っています:

while($counter < $MESSAGE_TIMEOUT_SECONDS) {
  $newData = getNewData();
  $hasDataChanged = hasDataChanged($newData, $oldData);
  if (  $hasDataChanged  ) {
     return $newData;
  }

  usleep($MESSAGE_POLL_MICROSECONDS);

}

古いデータはどこから入手できますか?つまり、リクエストを実行するときに、最後に与えられた現在の状態を投稿するか、セッションにデータを保存することができます。長いポーリングを実行するときにセッションにデータを保存することは許可されていますか、それともそのページの現在の状態でJavascriptからPOSTを実行する必要がありますか?

また、50ページを開いている人がデータベースを強制終了するのを防ぐにはどうすればよいですか?つまり、getNewData()は効果的にデータベースにアクセスします。ポーリング間隔が約0.5秒の場合、これは0.5秒ごとに50リクエストを意味する可能性があります。つまり、50個のタブを開くことにした場合、1人のユーザーが30秒でデータベースに50 x 2 x 30=3000リクエストを送信することを意味します。

何か案は?

4

1 に答える 1

0

すべてのajax応答データを、各オークションに変更があった最後の日付とともにメモリにキャッシュするので、古いデータと新しいデータを比較する必要はなく、日時だけを比較します。オークションの変更(クローズ、新規入札など)のキャッシュを無効にします。

次に、クライアント側から、最後の既知のデータ(最後のajax呼び出しまたはユーザーがページを開いたとき)から時間を送信し、日付を比較して、status:nochangeを返さなかった場合は、何かが変更されたかどうかを確認します(クライアント側は更新するものがないことを認識しています)キャッシュから必要なすべてのデータを返し、ユーザーページを更新した場合。

このモデルは、データベースを過負荷から保護する必要があります。

于 2013-02-16T17:47:52.317 に答える