2015-09-07 22 views
0

我在考慮擴展運行Socket.io的node.js服務器的功能,我目前使用它來允許客戶端(iOS應用程序)與服務器進行通信,以便它連接之間可以有持久的會話數據。用定時器清理Socket.io會話數據

在初始連接時,服務器向客戶端傳遞客戶端將存儲的會話ID,並在稍後斷開連接後重新連接到服務器,這將允許客戶端恢復會話而不必重新提供服務器並提供有關其當前狀態的某些信息(顯然,在實際實施時它會比這更安全)。

我希望使會話最終到期,所以它有一個最大生命週期,或者它在超時一段時間後還沒有繼續。爲此,我正在考慮爲每個會話使用計時器。我實際上不知道node.js或javascript定時器(setTimeout)如何在後臺工作,並擔心有1000個會話定時器會導致大量內存/ CPU使用。這可能是一個潛在的問題,我應該有一個垃圾收集器,每分鐘循環一次,並刪除過期的會話數據?對於性能方法影響最小的方法,我能做些什麼來實現這一點,或者定時器已經完全是這樣?

+0

一個計時器清理一分鐘似乎就足夠了。我不想讓1000s的計時器同時運行,但如果不需要毫秒精度,數百個應該可以。一種有效的方法是在連接時附加超時epoc日期戳,然後在清理過程中緩存Date.now()並與每個存儲的過期比較,如果稍後將其刪除。 – dandavis

+0

你是否意識到你可以將一個sessionID放入一個cookie中,並且它會自動與每個新的socket.io連接一起發送?然後,服務器可以檢查該會話,甚至可以設置cookie的到期時間,以便與刪除其會話數據時一致。 – jfriend00

+0

會話數據每分鐘都必須過期嗎?每15分鐘一次?這會將計時器活動減少15倍。我想說,如果您打算支持大量的連接用戶,則不希望每個用戶每分鐘都會產生一次計時器活動。您的node.js服務器將忙於無所事事,除非爲您提供這些定時器。 – jfriend00

回答

1

它們經常用於超時,並且在cpu中非常高效。

// ten_thousand_timeouts.js 
for (var i=0;i<=10000;i++) { 
    (function(i){ 
    setTimeout(function(){ 
     console.log(i); 
    },1000) 
    })(i) 
} 

使用10,000個日誌的結果只花費了0.336秒,並且將其記錄到控制檯的操作佔用了大部分時間。

//bash script 
$> time node ten_thousand_timeouts.js 
1 
... 
9999 
10000 

real 0m1.336s 
user 0m0.275s 
sys  0m0.146s 

我無法想象這是您的使用案例的問題。

+0

這很有趣,但仍然如其他人指出的評論超過其可能不那麼「雜亂」,以便每隔幾分鐘運行一次循環來清理會話數據,而不是將計時器附加到每個人身上 –

+0

我實際上認爲計時器不那麼「雜亂」。例如,如果每個連接都有一個計時器,您可以輕鬆修改特定連接的計時器(如果由於某些活動/反饋需要增加超時)。爲了做到這一點,你需要繁瑣的邏輯。 Node.js實際上使用定時器來實現此目的,其套接字超時時間爲https://github.com/nodejs/node/blob/c7be08cec18b0591381126e149cac96a05125966/lib/net.js#L299-L313 –