node.js - 在内存中存储 socket.io 套接字对象并在 Node 进程内同步

标签 node.js express socket.io mongoose

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

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 process(2) 中,我有问题。

那么如何处理这个问题,如何在所有 node.js 进程之间共享一个公共(public)对象?我对集群很陌生,到目前为止还没有合作过。

编辑:

我刚刚了解到,通过集群 fork 的工作人员无法共享,解决此问题的有效解决方案是创建每个端口具有不同端口的 node.js 进程,并与负载均衡器(如 HAProxy)建立粘性 session 。但是考虑一下,client1 连接到 nodejsP1 并且在 clientsOfP1[client1] = socket;和 client2 到 nodeJsP2 , 现在,如果 Client1 的 session 想要执行类似 clientsOfP2[client2].emit 的操作,它必须使用 ZeroMQ 等 IPC 与 P2 进行通信。这对生产有利吗?

最佳答案

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

更新:

因为 Node 是明确的单进程,所以它没有针对多进程通信进行优化。这对于像 Heroku 和小型 EC2 实例这样的环境特别有意义,在这些环境中,您的架构要在多台机器上水平扩展,而不是试图满足单个大型服务器的所有需求。这叫做 horizontal, share-nothing scaling , 是12因素设计的核心原则。

关于node.js - 在内存中存储 socket.io 套接字对象并在 Node 进程内同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19324622/

相关文章:

node.js - 就绪检查失败 : NOAUTH Authentication required

node.js - Node.js+express+session

javascript - Node中如何使用TCP与其他应用交互

nginx - Elastic Beanstalk 上的 WebSockets 与 Docker

node.js - 查看 express.js 中所有当前事件的 session

javascript - 如何在 Javascript node.js 中同步运行 parseString() 函数

node.js - 使用docker时无法从 Node 应用退出

node.js - jade循环无法访问node.js文件中的变量

node.js - 具有 jwt 授权的 get 方法返回空对象,我们是否需要解码 jwt token ?

Node.js - socket.io - 刷新页面并断开连接