2013-10-11 13 views
3

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

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

因此,所有的插座都在客户对象。但是这个客户端对象对于每个node.js过程都有不同的套接字(因为它们有单独的内存)。

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

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

编辑

我刚刚得知,工作人员通过集群分叉不能共享,并为这个问题的有效可行的解决方案是创建一个具有不同的端口node.js的过程和每一个与负载平衡器粘性会话(如HAProxy)。但考虑到这一点,客户端1已连接到nodejsP1并处于clientsOfP1 [client1] = socket;和client2到nodeJsP2, 现在,如果Client1的会话想要执行诸如clientsOfP2 [client2] .emit之类的操作,它必须与一些类似ZeroMQ的IPC进行通信。这对生产有好处吗?

回答

1

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

更新

因为节点是明确单一的过程,它不用于多进程通信进行优化。这对于像Heroku和小型EC2实例这样的环境来说特别有意义,在这种环境中,您的架构需要在许多机器上横向扩展,而不是试图满足来自单个大型服务器的所有需求。这被称为horizontal, share-nothing scaling,是12因子设计的核心原则。

+0

Ive更新了这个问题,请检查 –

+0

因此,服务器集群共享同一个Redis存储区会更好,因为它将保留套接字数据或在消息正在寻址时在不同服务器之间发送消息队列以发送数据另一台机器上的插座? – Xeos

+1

这两者都没问题,但您可能想要在服务器之间共享Redis商店的会话Cookie。如果是这样,你应该考虑在顶部实施Kue或Resque。 – dankohn