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