2012-07-12 74 views
8

對於每個可以持續10到30秒的連接用戶,我爲setTimeout和setInterval設置了不少服務器端超時。如果Node.js實例在其中一個超時期間重新啓動,則顯然它們在重新啓動時會被清除,這可能會給這些用戶帶來一些問題。我會如何去堅持這些超時,還是有任何模塊已經幫助了這個?在Node.js中重複執行setTimeout和setInterval重新啓動

+0

你不能使用node cron嗎? – albertjan 2012-07-12 18:43:35

+1

怎麼樣?這些不是我正在設置的cron作業,基於用戶與應用程序的交互,他們會暫停10-30秒。 – 2012-07-12 18:53:47

+0

你可以使用beanstalkd。它甚至可以堅持。 – Alfred 2012-11-28 23:22:01

回答

1

我會將開始時間和持續時間存儲在Redis中,並在應用程序重新加載時重新啓動不完整的定時器。有些Redis的模塊:

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

+0

你會如何確定應用程序崩潰?或者你會每秒更新redis中的start_time/duration? – 2015-09-22 09:12:19

1

setTimeOut需要延遲參數,所以設置超時時間,捕獲 'currentServerTime + delay' 時說, 'serverTriggerTime' 和DB堅持這一點。然後,在重新啓動服務器時,使用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時間後會發生。

相關問題