6

我目前正在创建一个水平可扩展的 socket.io 服务器,如下所示:

                 LoadBalancer (nginx)

      Proxy1      Proxy2      Proxy3      Proxy{N}

 BackEnd1   BackEnd2   BackEnd3   BackEnd4   BackEnd{N}

我的问题是,使用 socket-io redis 模块,如果它们都连接到同一个 redis 服务器,我可以从后端服务器之一向连接到其中一个代理服务器的特定套接字发送消息吗?如果是这样,我该怎么做?

4

2 回答 2

3

当你想扩展 socket.io 服务器,并且你已经使用 nginx 作为负载均衡器时,不要忘记设置sticky load balancing,其他单个连接将连接到基于负载均衡器的多个服务器,通过连接到 socket.io 服务器。所以更好用sticky load balancing

使用 redis 套接字 io 适配器,您可以在Redis Pub/Sub implementation.

如果你告诉我代理和后端使用了哪种技术,我会让你知道更多关于这方面的信息。

于 2015-12-11T13:35:35.753 回答
2

使用 socket.io-redis 模块,所有后端服务器将共享同一个连接用户池。您可以从 Backend1 发出,如果客户端连接到 Backend4,他将收到消息。

使用 Socket.io 进行这项工作的关键是在 nginx 上使用粘性会话,这样一旦我的客户端连接,它就会保持在同一台机器上。这是因为 socket.io 以 WebSocket 和几个长轮询线程开头的方式,它们都需要在同一个后端服务器上才能正常工作。

您可以将客户端连接选项更改为仅使用 Websockets,而不是粘性会话,这将消除与多个服务器的多个连接的问题,因为只有一个连接,即单个 Websocket。这也将使您的应用程序失去降级到长轮询而不是 WebSockets 的能力。

于 2015-12-15T20:23:14.537 回答