我想在3台不同的机器上设置socket.io服务器。我有一个负载均衡器设置用于在不同的服务器上分发请求,但是我如何将socket.io中的连接函数中的套接字对象分发给不同的服务器?我知道我们可以使用RedisStore pub / sub发布和编写redis事件,但是假设我有一个连接到机器1的客户端A,如果我有一个客户端B连接到机器3.客户端A如何发送给客户B的消息?或者我在socket.io中有其他一些架构可以用来实现它吗?
答案 0 :(得分:4)
如评论中所述,套接字是两台不同机器(在这种情况下是客户端和服务器)之间的连接,因此无法共享。对于解决此问题的基本结构,您需要3个组件:负载均衡器,套接字服务器和消息传递系统(Redis,RabbitMQ等)
最外层是负载均衡器。并非所有浏览器都支持Web套接字,因此Web套接字库提供HTTP轮询故障转移。本质上,客户端通过HTTP启动握手,服务器尝试将您的连接升级为基于直接TCP构建的双向二进制协议。如果成功,则通过Web套接字与服务器建立一对一连接。如果失败,套接字库将通过轮询来处理HTTP上的请求,以模拟Web套接字。
因此,必须配置负载均衡器以确保所有客户端的请求都发送到同一服务器,或者多个服务器可以认为客户端接收到来自它们的通信。
正如所料,服务器将处理所有客户端连接并管理与客户端之间的所有通信。但是,当客户端发送消息时,服务器会将消息发布到Redis,Redis将通知其订户新消息可用。在从Redis收到消息时,每个服务器都会通知相应的客户端。
如果我们逐步完成您的方案,它可能看起来像这样:
当然,围绕不向每台机器发送大规模有用的通知进行了优化,但希望这是对您所需内容的一个很好的总结。