CNode

cluster的进程安全问题

Yyunnysunny发布于13 年前最后回复13 年前8 回复5506 浏览0 收藏

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

查看回复

回复 (8)

L
liuyanghejerry#1·13 年前

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

L
leizongmin#3·13 年前
引用 liuyanghejerrycluster之间完全处于不同的进程空间,没有任何变量共享吧。这个和线程是不一样的,进程中的多个线程共享同一块内存空间,所以才会有线程安全一说。

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

Y
yunnysunny#4·13 年前
引用 liuyanghejerrycluster之间完全处于不同的进程空间,没有任何变量共享吧。这个和线程是不一样的,进程中的多个线程共享同一块内存空间,所以才会有线程安全一说。

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

Y
yunnysunny#7·13 年前

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

H
halfblood#8·13 年前

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

参与回复
登录后即可参与回复。登录