cluster的进程安全问题
发布于 10 年前 作者 yunnysunny 4740 次浏览 最后一次编辑是 8 年前

在node中启用cluster实现多进程后,对于全局变量,会是进程安全的吗

8 回复

cluster之间完全处于不同的进程空间,没有任何变量共享吧。这个和线程是不一样的,进程中的多个线程共享同一块内存空间,所以才会有线程安全一说。

这么说本来单进程可以使用的全局变量,开启cluster后就不能用了?

@yunnysunny 开启cluster后,全局变量在当前进程仍然是可用的,但是不能跨进程 (也就是说,无论是否开启了cluster,全局变量的作用都不会变,只是你不理解什么是进程而已) 进程 ≠ 线程

@leizongmin 在操作系统中有共享内存这么一说,如果是c代码的话,可以操作共享内存。但是看来node中,根本就没有这个特性,如果多个进程共同维护一段数据,要么得使用第三方数据源,要么采用进程间通信。cluster模式应该不支持进程间通信吧,看来只能使用前者了。

@yunnysunny

你应该读文档,而不是自己猜。Node是支持进程间通信的,cluster同样支持:http://nodejs.org/api/cluster.html#cluster_worker_send_message_sendhandle

@liuyanghejerry 好的,谢谢。

http://stackoverflow.com/questions/17626279/nodejs-clustering-and-expressjs-sessions express中如果session在服务器端存储在内存中,在多进程处理的时候也会出现问题。 我认为如果真想使用多进程共享内存数据的话,有必要开发一个c扩展,来读取操作操作系统的共享内存。

其实你提的问题是路由和node服务的状态问题;如果node服务是无状态的,并且是短连接的请求,应该不存在问题;如果是长连接,其实就是Session Sticky的问题了,就如http://stackoverflow.com/questions/17626279/nodejs-clustering-and-expressjs-sessions 说的,用数据库存储session(全局session),或者前端搭建一个负载均衡(nginx),配置Session Sticky,相同客户端路由到相同的Node节点就行了。

回到顶部