10

スケーラビリティを念頭に置いてプロジェクトを開発していますが、岐路に立っています。私の Web サイトで、ユーザーがオンラインかどうかを検出したいと考えています。そして、これを処理する最善の方法がまったく思い浮かびません。私が考えていた方法は、これらの行に沿ったものです(疑似コードで):

// SQL user table:
user {
  "name": "blah blah",
  "email": "derpy@derpyderp.com",
  "online": false
}

したがって、ユーザーがログインするたびに、彼のonline列を に更新できますtrue。ただし、最終的には、ユーザーがログインするたびに SQL クエリが発生することになり、1 秒あたり 10 回のログインとなると、大量のクエリが発生します。別のテーブルで同じことを行うことができると私が考えた別の方法:

// Activity table:
activity {
  "user_id": 2,
  "online": true
}

何らかの理由で、テーブルから分離されているため、メモリ消費量が少なくなると思いuserます。ただし、パフォーマンスに実際に影響があるかどうかはわかりません。

ですから、あなたの洞察力で私を祝福していただければ、私はさらに感謝します、ありがとう.

4

3 に答える 3

9

一般的に、lastActivity時間を格納するためにユーザーテーブルに列を追加するのが一般的な方法です。ユーザーがログインするか、ページにアクセスするときはいつでも、現在の時刻をそのフィールドに保存します。それらがオンラインであるかどうかを知りたい場合は、最後に記録された時間が特定のウィンドウ内(たとえば、5分)内にあるかどうかを確認してください。すべての行をクエリして、結果として現在オンラインになっているユーザーの数を確認できます。

数秒ごとにクエリを実行することについてはあまり心配していません。サーバーはそれを処理できます(これらが適切に記述されていて、あまり冗長ではないと仮定します)。

于 2012-05-25T04:25:18.050 に答える
0

フィールドタイプにdatetimeを使用できます。時間を追跡できるように、ユーザーIPを記録することを忘れないでくださいo

于 2012-05-25T04:45:35.653 に答える
0

どのように機能させたいかによって、基本的に 2 つのオプションがあります。

ユーザーがログアウトしたと見なすまでのタイムアウトを定義する ajax/websockets/whatever を使用してユーザーをポーリングする

       1: Timeout

これは、より単純な使用例です。ユーザーがページをリクエストするたびに、データベースのタイムスタンプを更新します。

オンラインのユーザー数を調べるには、このデータベースに対してクエリを実行し、過去 N 分間にアクティブだったユーザーを COUNT 実行します。

このようにして、現在サイトをアクティブに使用しているユーザーの数を比較的正確に把握できます。

      2: Constant polling

これは、サーバーを Ajax で更新する必要があるため、実装が少し複雑になります。それ以外は、#1 と同じように機能します。

ユーザーがページにいるときはいつでも、websocket を開いたままにするか、サーバーに対して N 秒ごとに ajax 要求を行うことができます。

このようにして、現在あなたのサイトでページを開いている人の数をかなりよく知ることができますが、ユーザーがブラウザでページを開いたままにして何もしない場合でも、オンラインとしてカウントされます.

アイデアを少し変更すると、クライアントでスクリプトを使用してマウスの動きを監視できます。ユーザーがページ上でマウスを 10 分間動かさない場合、ポーリングを停止するか、Websocket を切断します。これにより、アイドル状態のユーザーがオンラインとして表示される問題が修正されます。

于 2012-05-25T05:00:40.653 に答える