2013-10-24 79 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