10

接続しているユーザーごとに、setTimeout と setInterval を使用して、10 ~ 30 秒続くかなりの数のサーバー側タイムアウトを設定しました。これらのタイムアウトのいずれかの途中で Node.js インスタンスが再起動すると、それらはすべて再起動時にクリアされるため、これらのユーザーに問題が発生する可能性があります。これらのタイムアウトを永続化するにはどうすればよいですか、またはこれに役立つモジュールは既にありますか?

4

2 に答える 2

4

setTimeOutパラメータとして遅延を取るため、タイムアウトを設定するときに、これをキャプチャしcurrentServerTime + delayserverTriggerTimeDBに永続化します。次に、サーバーの再起動時に、 を使用して同じタイマーを作成しますserverTriggerTime。次に、delay = serverTriggerTime - currentServerTimeこの遅延を使用して新しいタイマーを設定します。

タイマー設定時

const date = Date.now();
const serverTriggerTime = date + delay; // time in milliseconds

サーバーの再起動時:

serverTriggerTime = // retrieve from DB.
newDelay = serverTriggerTime - Date.now();

また、newDelay >= 0 の場合にのみ新しいタイマーを設定します。つまり、トリガー時間に達しておらず、newDelay 時間の後に発生します。

于 2017-06-10T04:11:50.390 に答える
2

開始時刻と期間を Redis に保存し、アプリケーションのリロード時に不完全なタイマーを再起動します。一部の Redis モジュール:

https://github.com/joyent/node/wiki/modules#wiki-db-nosql-redis

于 2012-07-12T16:55:50.387 に答える