2013-10-24 121 views
0

我有一個節點服務器用於加載某些可以被任何人編寫的腳本。我明白,當我啓動我的節點服務器時,模塊首次在全局範圍內加載。當一個人請求一個頁面時,它會被「啓動服務器」回調加載;並且我可以根據請求使用所有已加載的模塊。但是我沒有遇到過一個腳本,其中全局變量在請求時間內發生了變化,並影響了進程中的每一個其他實例(也許有)。在NodeJS中使用和更新全局變量是否安全?

我的問題是,是多麼安全的話,在服務器崩潰的條件,改變全局數據?此外,假設我已經編寫了一個適當的鎖定機制,可以在所有實例上暫停服務器很短的時間,直到正確的數據加載完畢。

回答

2

Node.js的是單線程。所以兩個獨立的請求不可能同時改變一個全局變量。所以從理論上講,這是安全的。但是,如果您要將用戶A的數據臨時保存在一個變量中,然後當用戶A稍後提交另一個請求時,請注意用戶B可能會在潛在改變用戶A的數據之間發出請求。

對於這樣的情況保持全局值在數組或對象是分離的用戶數據的一種方式。另一種策略是在回調密集型或面向事件/承諾的庫(如socket.io)中使用閉包。

當涉及到多線程或者多,消息傳遞風格的API類似節點的內置集羣模塊,因爲每個進程都有自己的全球不重挫全局的同樣的保障。有幾個多線程模塊的實現類似 - 每個線程一個節點實例。然而,共享內存風格的API不能做出這樣的保證,因爲每個線程現在都是一個真正的操作系統線程,它可能會搶佔對方並打破其他內存。因此,如果您決定試用其中一個多線程模塊,請注意這個問題。

有可能利用消息傳遞雖然實行假共享內存 - 有點像我們如何使用Ajax或socket.io做到這一點。所以我個人會避免使用共享內存風格的多線程,除非我真的需要協作處理一個非常大的數據集,從而導致消息傳遞體系結構停滯不前。

話又說回來,記住,網絡與信息是HTML和XML和JSON一個巨大的消息傳遞架構。因此消息傳遞擴展到Google大小。

+0

關於用戶數據部分,用戶A嘗試存儲全局數據。無論誰打開請求,都會將數據追加到全局數組中。然後當用戶B打開它時,他可以自己使用全局數據。我想我澄清了不清楚的部分。 – Gasim

+0

我需要閱讀更多關於多線程。感謝您的信息! – Gasim