我有一个节点服务器,用于加载任何人都可以编写的脚本。据我所知,当我启动Node服务器时,模块首次在全局范围内加载。当一个人请求一个页面时,它会被“启动服务器”回调加载;我可以根据请求使用所有已加载的模块。但是我没有遇到一个脚本,其中全局变量在请求时间内发生了变化,并且影响了流程中的每个其他实例(可能存在)。
我的问题是,在服务器崩溃方面,改变全球数据有多安全?另外,假设我已经编写了一个适当的锁定机制,可以在很短的时间内为所有实例“暂停”服务器,直到加载了正确的数据。
答案 0 :(得分:3)
Node.js是单线程的。因此,两个单独的请求不可能同时更改全局变量。所以从理论上讲,它是安全的。
但是,如果你正在做一些事情,比如暂时将用户A的数据保存在一个变量中,那么当用户A稍后提交另一个请求时,请使用该变量注意用户B可能在可能改变用户A的数据之间发出请求。 / p>
对于这种情况,在数组或对象中保留全局值是分离用户数据的一种方法。另一种策略是使用闭包,这是回调密集型或面向事件/承诺的库中的常见做法,例如socket.io。
当谈到多线程或多处理时,像节点的内置集群模块这样的消息传递样式API具有不破坏全局变量的相同保证,因为每个进程都有自己的全局变量。有几个多线程模块实现类似 - 每个线程一个节点实例。但是,共享内存样式API无法做出这样的保证,因为每个线程现在都是一个真正的操作系统线程,它可以相互抢占并破坏彼此的内存。因此,如果您决定尝试其中一个多线程模块,请注意这个问题。
可以使用消息传递来实现伪共享内存 - 有点像我们使用ajax或socket.io这样做。所以我个人避免使用共享内存样式多线程,除非我真的需要合作地处理一个会阻碍消息传递架构的非常大的数据集。
然后再次记住,网络是一个巨大的消息传递架构,消息是HTML和XML和json。因此,邮件传递会扩展到Google大小。