NodeJS部分疑惑
发布于 2年前 作者 sanvibyfish 1257 次浏览

Nodejs貌似启动就是单核单进程的

那么我启动node后,需要用多核怎么办?

我看外面好像是凯多个instance,用nginx在实现绑定

那么又有疑问了,他们是相对独立的吗?那么如何做数据共享呢?

还有种方式是fork多个子进程(是子进程吗?),然后绑定到同一个端口上,那么他们的数据是如何共享的?

假设我有NodeA,NodeB,NodeC3个进程都绑定在同一个端口3000上

那么NodeA里面有个Array,NodeB和NodeC知道吗?

那么如果客户端访问3000,是访问有NodeA,NodeB,NodeC3其中哪一个

13 回复

尽量不要使用进程间共享,如有需要,请使用memcache或者,redis等共享状态

不能同一个端口把。。。会报异常把

那么pm2 的多核心是什么意思,我可以使用pm2 start app.js -i max,他会出现多个进程

那么我是不是需要比如一台四核的机器,那么开4个instance,然后把需要的数据存进redis,然后通过redis来实现共享呢?

@sanvibyfish 一个套接字连接监听了一个端口 其他套接字就用不了这个端口 多进程和套接字没关系吧 多进程 就像cpu的核数就是人 有2个进程启动 就会根据cpu是的时间片轮转进程调度算法 如果有2个人要么一起做每个人做自己的事情,要么根据算法来分配 我是这么理解的 一个端口只能被使用一次 但是这个 套接字可以被多个进程使用 但是内存只有一个 2个进程如果同时改一个内存上面的数据就会有产生不是自己想要的结果

@sanvibyfish 是这个意思,但不需要开4个instance,直接用node.js的cluster模块就可以了

@dengqiao cluster 模块之间数据共享还是需要redis或者memcache对吧

@dengqiao 那么如果我使用socket.io那么socket这个object怎么进行共享,总不能存到redis里面去吧

@sanvibyfish 分配唯一id存Id就可以了

@dengqiao 存ID我怎么拿到那个socket的对象

Node.js默认是单线程的,而Node.js中也提供了两个创建进程的方法——Child ProcessCluster。 其中,Child Process在创建子进程时,父进程和子进程之间会建立IPC通道,可以利用process.send方法进行消息递。 而Cluster和CP类似,可以使用worker.send(on Master)和process.send(on Worker)进行消息传递。

而我还是比较建议使用Redis或者Memcache等第三方数据存储服务来实现进程间的数据交换。


然而如果你需要建立一个Cluster集群来对优化HTTP服务在多核服务器上的性能,那么可以看看@aleafspm,它是基于Child Process来实现HTTP Server Cluster对一个端口的监听,它也提供了send方法。

官方的标准cluster模块更优

回到顶部