6

[正確に]300秒(5分)の間アクティビティがないプライベートチャットルームを監視するために使用されるバックエンドモジュール(PHPで記述)を構築しています。そうである場合、スクリプトはデータベースを更新します(最大ユーザー数を特定の数に設定します)。now()と最後に送信されたメッセージの時間差によってアイドル時間のスパンを監視しています。


私がしたこと:監視スクリプトを1分または60秒ごとに(php-cliを介して)実行するcronジョブを設定します。監視スクリプトの内部:

$expire_time = time() + 60;

//this loop will run for 60 seconds
while(time() < $expire_time)
{
  $idle_time = get_all_chatrooms_idle_time();
  foreach($idle_time as $s_time)
  {
    if($s_time >= 300)
    {
      update_changes();
    }
  }
  usleep(500000);
}

300秒のアイドル時間後に最大ユーザー数を即座に設定するという条件は交渉できません。ですから、「何かが実際にそれを要求するまで何もしない」というようなアドバイスには、あまり意味がありませんが、実際には従うことができません。

理由?アクティブおよび非アクティブなチャットルームのデータは、ダッシュボードにも表示されるため、リアルタイムである必要があります。チャットルームのモデレーターの支払いはそれに依存します。


ダッシュボードの読み込みごとにチェックしてみませんか?申し訳ありませんが、それでも不可能です。

チェックはサーバー側で行う必要があり、ダッシュボードはajaxで更新され、毎秒ポーリングされます。

ajax呼び出しによって要求されているページに監視コードを添付すると、現在の実装よりもリソースを大量に消費すると思います(Imが間違っている場合は修正してください)

ユーザー数の概算を示して、取得している負荷/トラフィックを想像できるようにします。

  • モデレーターを含むおしゃべりの数:〜800
  • チャットルームの数:〜250
  • (x)チャットルームモデレーターの数:〜50
  • (x)私の上司と彼のスタッフ:

(x)-ダッシュボードを表示できます


もっと良い方法はありますか?私はそれを正しくやっていますか?

4

3 に答える 3

2

このループはやり過ぎです。中程度のサーバーでも1分間に何千回も実行される可能性があり、リアルタイムアプリでも高いCPU使用率を生成します。カウンターを追加し、反復回数を確認します。これは、すべてのAJAXリクエストで処理するよりもさらに多くの負荷を生成すると思います。

まず、情報が必要な粒度を決定します。3秒の粒度(たとえば、3秒ごとにデータベースをスイープする)を選択したとします。この数値は高すぎる可能性がありますが、多くを失うことはないことを示しています。AJAXが毎秒プルすると、1回または2回連続してクロールバックする必要があるいくつかのカウンターが表示される可能性があります(実際にそのようなものが表示されるかどうかは、カウンターの性質によって異なります。)

カウンターが秒の範囲のデータに基づいている場合(たとえば、経過秒の合計、または$ /秒に基づく量を表示する場合)、2番目のAJAXプルは連続カウンターを提供しません。(ネットワーク上の理由から、1秒を逃したり、その秒に2回更新したりすることがあります)。

選択した粒度に関係なく、最終的な統計は絶対タイムスタンプに基づいているため、評価がどれだけ遅くても問題ありません。

2番目のAJAXポーリングを使用してスムーズなカウンターを実装する場合は、それよりもはるかに優れています。カウントはクライアント側で実行する必要があります(たとえば、2番目の増分で値を送信する:revenue: <span data-inc="25">14432</span>JSでカウントする)。カウンターの停止/リセットの状態を監視するためにAJAXを実装する唯一の方法。次に、通知が遅れる可能性がある時間(たとえば、10秒)を決定するだけで、カウンターは最大でオーバースクロールします。10秒で期待値に戻ります。この場合、DBクリーンアップをそれほど頻繁に実行しないでください(たとえば、間隔の半分)。これにより、たとえば、サイクルで3秒間のスリープが可能になり、負荷が大幅に減少します。

すべてのチャットルームの有効期限タイムスタンプをデータベース(レコード内または固定)に追加することを簡単に選択できる場合は、少し読み取りを高速化する(さらに、部屋ごとの有効期限ルールを許可する)インデックスを使用します。

于 2012-12-07T07:37:40.817 に答える
1

コメントによると、アプリケーションを構築するための偶数駆動型I/O非同期プラットフォームであるnode.jsなどのテクノロジーを使用することをお勧めします。チャットルームが外部アプリケーションの場合、簡単にソケットを開いてチャットルームをリッスンし、ログに記録し、ユーザーのアクティビティをチェックし、特定のイベントをリッスンできます。

于 2012-12-07T07:37:45.643 に答える
1
#!/usr/bin/php
<?php

if( file_exists('/tmp/chatrooms_cron.lock') ) {
   die( 'There is already a script running.' );
}

file_put_contents( '/tmp/chatrooms_cron.lock', 1 ); // Storing pid would be better 

// Run loop forever
while( true )
{
  $idle_time = get_all_chatrooms_idle_time();

  foreach($idle_time as $s_time)
  {
    if($s_time >= 300)
    {
      update_changes();
    }
  }

  sleep( 60 );
}

node.jsのヒント(socket.ioを使用):

私はnode.jsを仕事で使っています!リアルタイムで、ie5/ie6までのブラウザで動作します。これは、node.jsの内部で実行できます。

setInterval( function() {
   // Fetch and update peers
}, 300000 );
于 2012-12-07T07:46:27.340 に答える