Socket.io分布在不同的服务器上

时间:2015-02-15 22:02:41

标签: node.js redis socket.io

我想在3台不同的机器上设置socket.io服务器。我有一个负载均衡器设置用于在不同的服务器上分发请求,但是我如何将socket.io中的连接函数中的套接字对象分发给不同的服务器?我知道我们可以使用RedisStore pub / sub发布和编写redis事件,但是假设我有一个连接到机器1的客户端A,如果我有一个客户端B连接到机器3.客户端A如何发送给客户B的消息?或者我在socket.io中有其他一些架构可以用来实现它吗?

1 个答案:

答案 0 :(得分:4)

如评论中所述,套接字是两台不同机器(在这种情况下是客户端和服务器)之间的连接,因此无法共享。对于解决此问题的基本结构,您需要3个组件:负载均衡器,套接字服务器和消息传递系统(Redis,RabbitMQ等)

负载均衡器

最外层是负载均衡器。并非所有浏览器都支持Web套接字,因此Web套接字库提供HTTP轮询故障转移。本质上,客户端通过HTTP启动握手,服务器尝试将您的连接升级为基于直接TCP构建的双向二进制协议。如果成功,则通过Web套接字与服务器建立一对一连接。如果失败,套接字库将通过轮询来处理HTTP上的请求,以模拟Web套接字。

因此,必须配置负载均衡器以确保所有客户端的请求都发送到同一服务器,或者多个服务器可以认为客户端接收到来自它们的通信。

服务器和Redis

正如所料,服务器将处理所有客户端连接并管理与客户端之间的所有通信。但是,当客户端发送消息时,服务器会将消息发布到Redis,Redis将通知其订户新消息可用。在从Redis收到消息时,每个服务器都会通知相应的客户端。

如果我们逐步完成您的方案,它可能看起来像这样:

资源

  1. 负载均衡器
  2. 3个套接字服务器(机器1,2和3)
  3. Redis的
  4. 客户(客户A和B)
  5. 步骤

    1. 客户端A请求套接字连接
      • 负载均衡器路由到机器1,并在必要时路由所有未来的请求
      • 套接字服务器尝试将客户端升级到双向套接字
      • 服务器存储包含详细信息的客户
    2. 客户端B请求套接字连接
      • 与步骤1相同,但与机器3连接
    3. 客户端A向客户端B发送消息
      • 客户端A向计算机1发送消息
      • 计算机1将消息发布到Redis
      • Redis通知订阅者新邮件,包括Machine 3
      • 机器3通知客户B消息
    4. 当然,围绕不向每台机器发送大规模有用的通知进行了优化,但希望这是对您所需内容的一个很好的总结。