2013-06-28 86 views
0

我已經得到了它接受潛在的socket.io連接的幾萬Node.js服務器超時長了數以萬計的時候。效率如何JavaScript的setTimeout函數與

對於每個插座,我需要有某種形式的間隔(使用setInterval()),以通知內存中的數據庫在插槽中仍然有效。這純粹是爲了垃圾收集的目的 - 當一個套接字被認爲是不活動的,它的會話數據將被gc'd。

有兩個天真的方法:

  1. 爲了有哪些,觸發時,將通過所有插座運行,並通知他們是活躍在數據庫中的所有插座一個超時
  2. 設置超時爲每個套接字

第一種方法對我的應用程序層更高效,但對數據庫更加嚴格,因爲所有請求都會立即發生(儘管不是經常發生)。
第二種方法很好,因爲數據庫命中將更均勻地展開,但我不確定這將對應用程序本身的性能有多苛刻。

所以考慮到這一點,它是有效的有數以萬計的同步間隔的前提是他們都非常長(各約每10分鐘一次)?

+0

是在內存中的數據庫SQL像數據庫或是它自己的結構?我會將_marking優化爲active_ procedure(製作更新包),而不是對每個套接字使用超時 - 這可能給錯誤的印象提供更好的解決方案,因爲如果調用超時的時間和時間取決於服務器以及套接字是什麼時候創造(它可以使整個事情更加惡化) –

回答

2

第一種方法可能不是數據庫的詳細harshe,因爲你可以在同一時間更新了很多紀錄,而不是做一個數據庫調用每個插座。

通過瓜分中的批次插座,說1000,有幾個數據庫調用,而不是成千上萬的數據庫調用的,你可以更新數據庫記錄。

這將是一個位在那一刻數據庫的工作,但考慮,否則你將做10-20數據庫調用每一秒更新套接字信息,你可能會減輕負荷對數據庫的整體。