我在考慮擴展運行Socket.io的node.js服務器的功能,我目前使用它來允許客戶端(iOS應用程序)與服務器進行通信,以便它連接之間可以有持久的會話數據。用定時器清理Socket.io會話數據
在初始連接時,服務器向客戶端傳遞客戶端將存儲的會話ID,並在稍後斷開連接後重新連接到服務器,這將允許客戶端恢復會話而不必重新提供服務器並提供有關其當前狀態的某些信息(顯然,在實際實施時它會比這更安全)。
我希望使會話最終到期,所以它有一個最大生命週期,或者它在超時一段時間後還沒有繼續。爲此,我正在考慮爲每個會話使用計時器。我實際上不知道node.js或javascript定時器(setTimeout)如何在後臺工作,並擔心有1000個會話定時器會導致大量內存/ CPU使用。這可能是一個潛在的問題,我應該有一個垃圾收集器,每分鐘循環一次,並刪除過期的會話數據?對於性能方法影響最小的方法,我能做些什麼來實現這一點,或者定時器已經完全是這樣?
一個計時器清理一分鐘似乎就足夠了。我不想讓1000s的計時器同時運行,但如果不需要毫秒精度,數百個應該可以。一種有效的方法是在連接時附加超時epoc日期戳,然後在清理過程中緩存Date.now()並與每個存儲的過期比較,如果稍後將其刪除。 – dandavis
你是否意識到你可以將一個sessionID放入一個cookie中,並且它會自動與每個新的socket.io連接一起發送?然後,服務器可以檢查該會話,甚至可以設置cookie的到期時間,以便與刪除其會話數據時一致。 – jfriend00
會話數據每分鐘都必須過期嗎?每15分鐘一次?這會將計時器活動減少15倍。我想說,如果您打算支持大量的連接用戶,則不希望每個用戶每分鐘都會產生一次計時器活動。您的node.js服務器將忙於無所事事,除非爲您提供這些定時器。 – jfriend00