0

nodejs で時限アプリケーションを作成する必要があります。ユーザーは、毎日、毎週、毎月を設定できます。私の最初の考えは、次のようなものを作成することでした:

socket.on("connect")
{
  client.on("authenticate")
  {
    var frequency = GetTimersForUser(client);
    var timersInMilliseconds = ConvertFrequencyToMS(frequency);
    var nextInMS = GetLower(timersInMilliseconds);
    setTimeout("timedCount()",nextInMS );
  }
}
timedCount()
{
  cancelTimer;
  client.emit("poke");
  var frequency = GetTimersForUsers(client); 
 ...
  setTimeout("timedCount()",nextInMS );
}

しかし、タイマーは接続後にのみ作成されるため、失敗したタイマー (クライアントが切断された場合) について警告することはありません。それで、毎秒1つのタイマーを作成する方が速いですか:

    userslist = getIndividualUsersNextTimerAsDate();
  setTimout("timedCount()",1000);
    timedCount()
    {
      foreach(user in userslist)
      {
       if(user.time <= now())
       {
        if(user.socket)
        {
        user.socket.emit("poke");
        }
        user.time = resetTimeForNextTimer(user);
       }
      }
    }
    socket.on("connect")
    {
      ...
      userslist[x].socket = client;
    } 

または「時間」ごとに複数のタイマー:

var userslist = GetUsersTimers();
  foreach(user in userslist)
  {
    user.Counter = setTimeout("runTime()",client.timer );
  }
 runTime(client)
 {
  client.emit("poke");
  client.Counter.cancel();
  client.timer = resetToNextTimer();
  client.Counter = setTimeout("runTime()",client.timer );
 }

または、私が見逃しているより良い方法はありますか?

4

1 に答える 1

0

タイマーの中には数日続くものもあるようですが、通常、接続はそれほど長くは続きません。ユーザーはサーバーに再接続し、常に接続されますか?

ユーザーが常に接続されていると仮定すると、終了時刻をデータベースに保存します。サーバーがダウンした場合は、終了時刻を回復して正常に再起動できます。新しいタイマーを取得したら、setTimeout を使用してスリープ状態にします。再起動時に、終了時間と現在の時間がわかっている (つまり、期間を取得する) ため、setTimeout をやり直すことができます。

これは、「妥当な」数のタイマーで機能します。これらのタイマーが何百万もある場合は、実際には、X ミリ秒/秒/分ごとに起動し、終了時刻のいずれかが経過したかどうかを確認し、それらに基づいて動作し、スリープ状態に戻る setInterval を使用する方がよい場合があります。 .

于 2012-09-07T19:09:53.783 に答える