我有一个节点应用程序,现在正在单核处理器上运行,但很快即将使用群集并将同步的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进行通信。这对生产有好处吗?
Ive更新了这个问题,请检查 –
因此,服务器集群共享同一个Redis存储区会更好,因为它将保留套接字数据或在消息正在寻址时在不同服务器之间发送消息队列以发送数据另一台机器上的插座? – Xeos
这两者都没问题,但您可能想要在服务器之间共享Redis商店的会话Cookie。如果是这样,你应该考虑在顶部实施Kue或Resque。 – dankohn