1

我有一个节点服务器,用于加载任何人都可以编写的某些脚本。我知道当我启动我的节点服务器时,模块第一次在全局范围内加载。当一个页面请求时,它被“启动服务器”回调加载;我可以根据请求使用所有已加载的模块。但是我还没有遇到过一个脚本,其中全局变量在请求期间被更改并影响进程中的每个其他实例(也许有)。

我的问题是,就服务器崩溃而言,更改全局数据有多安全?另外,假设我已经编写了一个适当的锁定机制,它将在很短的时间内为所有实例“暂停”服务器,直到加载适当的数据。

4

1 回答 1

4

Node.js 是单线程的。所以两个单独的请求不可能同时改变一个全局变量。所以理论上是安全的。

但是,如果您正在做一些事情,例如将用户 A 的数据临时保存在变量中,然后当用户 A 稍后提交另一个请求时使用该变量,请注意用户 B 可能会在可能更改用户 A 的数据之间发出请求。

对于这种情况,将全局值保存在数组或对象中是分离用户数据的一种方法。另一种策略是使用闭包,这是回调密集型或面向事件/承诺的库(如 socket.io)中的常见做法。

当涉及到多线程或多处理时,像节点的内置集群模块这样的消息传递风格 API 具有相同的保证不会破坏全局,因为每个进程都有自己的全局。有几个类似实现的多线程模块 - 每个线程一个节点实例。然而,共享内存风格的 API 不能做出这样的保证,因为每个线程现在都是一个真正的操作系统线程,它可能会互相抢占并互相破坏内存。因此,如果您决定尝试其中一个多线程模块,请注意这个问题。

不过,可以使用消息传递来实现假共享内存——有点像我们使用 ajax 或 socket.io 的方式。所以我个人会避免共享内存样式的多线程,除非我真的非常需要合作处理一个非常大的数据集,这会阻碍消息传递架构。

再说一遍,请记住,Web 是一个巨大的消息传递架构,其中的消息是 HTML、XML 和 json。因此,消息传递可以扩展到 Google 大小。

于 2013-10-24T17:19:32.063 回答