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

ano*_*123 5 redis node.js socket.io

我想在3台不同的机器上安装socket.io服务器。我有一个负载平衡器设置,用于在不同服务器之间分配请求,但是如何将在socket.io中的连接函数中获得的套接字对象分配给不同服务器?我知道我们可以使用RedisStore pub / sub来发布和记录redis事件,但是假设我有一个连接到计算机1的客户端A,并且有一个连接到计算机3的客户端B。给客户B的消息?还是在socket.io中还有其他架构可以用来实现这一目标?

Emp*_*nal 5

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

负载均衡器

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

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

服务器和Redis

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

如果我们要逐步解决您的情况,则可能看起来像这样:

资源资源

  1. 负载均衡器
  2. 3个套接字服务器(机器1、2和3)
  3. 雷迪斯
  4. 客户(客户A和B)

脚步

  1. 客户端A请求套接字连接
    • 负载均衡器路由到计算机1,并且如有必要,还将在将来路由所有将来的请求
    • 套接字服务器尝试将客户端升级到双向套接字
    • 服务器存储客户端的详细信息
  2. 客户端B请求套接字连接
    • 与步骤1相同,但与机器3连接
  3. 客户端A向客户端B发送消息
    • 客户端A向计算机1发送消息
    • 机器1将消息发布给Redis
    • Redis通知新消息的订阅者,包括计算机3
    • 机器3将消息通知客户端B

当然,有一些优化措施,可以不向每台计算机发送通知,这对于大规模使用很有用,但是希望这是对您所需要内容的很好总结。