1

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

但是如果我有多个服务器进程正在运行呢?我必须确保客户端实际连接到的正确服务器进行发送。是否可以 ?

4

2 回答 2

1

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

于 2013-01-17T12:06:33.163 回答
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 更好,因为它可以很容易地分布在一个数据中心和多个数据中心。
于 2013-01-17T14:55:23.783 回答