将socket.io套接字对象存储在内存中,并在节点进程中进行同步

我有一个正在运行在单核处理器上的节点应用程序,但是很快我将使用群集并将redis的socket.io与同步的socket.io一起用于多个node.js进程。 我将连接的客户端(socket.io的socket对象)存储在内存中,例如

io.sockets.on('connection',function(socket){ clients[someId][someId2] = socket; }) 

所以所有的套接字都在客户端对象中。 但是这个客户端对象为每个node.js进程有不同的套接字(因为它们有单独的内存)。

现在,如果我clients[someId][someId2].emit('something')从node.js进程(1),如果该client[someId][someId2]实际上在node.js进程(2),我有问题。

那么如何处理这个问题呢,如何在所有的node.js进程之间共享一个共同的对象呢? 我对集群非常新,迄今还没有工作。

编辑

我刚才了解到,通过集群分叉的工作人员不能共享,而针对这个问题的高效工作解决scheme是创build具有不同端口的node.js进程,并与负载平衡器(如HAProxy)进行粘性会话。 但考虑到这一点, client1连接到nodejsP1,并在clientsOfP1 [client1] =套接字; 和client2到nodeJsP2,现在如果Client1的会话想要做一些像clientOfP2 [client2] .emit那样的话,它必须和一些像ZeroMQ这样的IPC进行通信。 这对生产有好处吗?

最常见的方法是使用像Redis这样的数据库,并且为了消息传递,像Kue这样的队列系统。 使用像RabbitMQ,Resque或Kue这样的队列系统来启用IPC是非常常见的。 在某些情况下,无论如何,您将会超过一台服务器,并需要能够在服务器之间的进程间进行通信。

更新

由于节点是明确的单一进程,因此不会针对多进程通信进行优化。 这对于像Heroku和小型EC2实例这样的环境来说特别有意义,在这个环境中,您的架构需要在许多机器上横向扩展,而不是试图满足来自单个大型服务器的所有需求。 这被称为水平的,无共享缩放 ,是12因子devise的核心原则。