如何使用带有多个服务器进程的socket.io向单个客户端发送消息?

时间:2013-01-17 12:04:51

标签: node.js socket.io

我即将开始使用socket.io,这更像是一个理论问题, 假设我想用socket.io向特定用户发送消息, 通常情况下,我必须使用相关的用户ID存储socketid,并在发送时获取socketid并发送给。

但如果我有多个服务器进程正在运行怎么办?我必须确保客户端实际连接的正确服务器进行发送。有可能吗?

2 个答案:

答案 0 :(得分:1)

对于多个服务器实例,您需要具有用于身份验证的缓存服务(memcache,redis)以及所有节点实例绑定到的中央消息队列服务(stormMQ,rabbitMQ,AQ,基于java的mq)。因此,Node实例绑定到每个客户端/通道/任何内容的消息队列,所有其他绑定的Node实例接收消息并将它们转发给客户端。

答案 1 :(得分:1)

问题通常在于如何使用WebSocket集群:

  • 几个前端服务器,负责处理与每个客户端的双向连接。它们构成了WebSocket集群。
  • 几个后端服务器,负责处理应用程序的业务逻辑。

每次后端想要通知客户端时,它都会向WebSocket集群发送请求,该集群负责与客户端通信。 可能的情况:

  • 使用唯一ID标识每个WebSocket群集的服务器。
  • 使用唯一ID识别每个客户。
  • 每次客户端连接您的一个WebSocket集群服务器时,将其唯一ID以及服务器的唯一ID存储在分布式键/值数据库中。
  • 因此,您知道哪个客户端与哪个服务器连接。
  • 下次您的后端应用程序想要通知客户端时,有两种可能性:
    1. 数据库中不存在对(clientId,serverId),您无法通知客户端。
    2. 数据库中存在对(clientId,serverId),然后您必须向serverId标识的服务器发出通知,以通知clientId标识的客户端。

注意:

  • 每个WebSocket集群的服务器都可以使用socket.io运行node.js实例。它必须提供一个路由,它将clientId作为参数,并将使用socket.io来通知此客户端。实际上,socket.io知道客户端正在使用此服务器上的哪个套接字。
  • 每次服务器崩溃时,都必须清理数据库并删除包含服务器ID的所有对。
  • 部署WebSocket群集可能很乏味,因此您可以获得Kaazing等商业优惠。
  • 像数据库一样好的分布式键/值是Riak。出于上述目的,它比Redis或Memcached更好,因为它可以很容易地分布在数据中心和多个数据中心。