【问题标题】:Storing socket.io socket object in memory and synchronizing within node processes将 socket.io 套接字对象存储在内存中并在节点进程中同步
【发布时间】:2013-10-11 18:10:40
【问题描述】:

我有一个节点应用程序,它现在在单核处理器上运行,但很快我将使用集群并将 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 进程(2) 中,我有问题。

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

编辑

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

【问题讨论】:

    标签: node.js express socket.io mongoose


    【解决方案1】:

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

    更新

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

    【讨论】:

    • 所以服务器集群最好共享同一个 Redis 存储,其中套接字数据将被保存或有一个消息队列在消息寻址另一个套接字时在不同服务器之间发送数据机器?
    • 两者都可以,但您可能希望在服务器之间共享 Redis 存储以获取会话 cookie。如果是这样,您应该考虑在顶部实施 Kue 或 Resque。
    猜你喜欢
    • 2023-04-02
    • 2013-08-21
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 2013-01-18
    • 2017-04-18
    相关资源
    最近更新 更多