我有一个节点应用程序,它现在正在单核处理器上运行,但很快我将使用集群和sync.io与redis同步多个node.js进程。我将连接的客户端(socket.io的套接字对象)存储在内存中,例如
io.sockets.on('connection',function(socket){
clients[someId][someId2] = socket;
})
所以所有的套接字都在客户端对象中。但是这个clients对象为每个node.js进程都有不同的套接字(因为它们有独立的内存)。
现在,如果来自node.js进程(1)的i clients[someId][someId2].emit('something')
并且如果client[someId][someId2]
实际上是在node.js进程(2)中,那么我有问题。
那么如何处理这个问题,如何在所有node.js进程之间共享一个公共对象?我是一个非常新的集群,到目前为止还没有合作过。
编辑:
我刚刚了解到,通过集群分叉的工作人员无法共享,并且针对此问题的高效工作解决方案是创建具有不同端口的node.js进程,并且与负载均衡器(如HAProxy)具有粘性会话。但考虑到这一点, client1 连接到nodejsP1并且位于clientsOfP1 [client1] = socket;和client2到nodeJsP2, 现在,如果Client1的会话想要执行像clientsOfP2 [client2] .emit这样的事情,它必须与某些IPC(如ZeroMQ)进行通信。这对生产有益吗?
答案 0 :(得分:1)
最常见的方法是使用像Redis这样的数据库,对于消息传递,使用像Kue这样的队列系统。使用像RabbitMQ,Resque或Kue这样的队列系统来启用IPC是非常常见的。在某些时候,无论如何,您将需要能够在服务器之间进行通信。
<强>更新强>:
由于Node是显式单进程,因此未针对多进程通信进行优化。这对于像Heroku和小型EC2实例这样的环境特别有意义,在这些环境中,您的体系结构可以在多台计算机上横向扩展,而不是尝试满足单个大型服务器的所有需求。这称为horizontal, share-nothing scaling,是12因素设计的核心原则。