我目前正在创建一个水平可伸缩的socket.io服务器,如下所示:
LoadBalancer (nginx)
Proxy1 Proxy2 Proxy3 Proxy{N}
BackEnd1 BackEnd2 BackEnd3 BackEnd4 BackEnd{N}
我的问题是,使用socket-io redis模块,如果它们都连接到同一个redis服务器,我可以将消息发送到连接到其中一个后端服务器的代理服务器之一的特定套接字吗?如果是这样,我该怎么做?
答案 0 :(得分:3)
由于您要扩展socket.io服务器,并且您已经使用nginx作为负载均衡器,请不要忘记设置sticky load balancing
,其他单连接将连接到多个服务器,基于负载均衡器将连接传递给socket.io服务器。最好使用sticky load balancing
使用redis socket io适配器,您可以在Redis Pub/Sub implementation
的帮助下使用一个或多个socket.io服务器发送和接收消息。
如果您告诉我代理和后端使用了哪种技术,我会告诉您有关此问题的更多信息。
答案 1 :(得分:2)
使用socket.io-redis模块,所有后端服务器将共享相同的连接用户池。您可以从Backend1发出,如果客户端连接到Backend4,他将收到消息。
使用Socket.io进行此操作的关键是在nginx上使用粘性会话,这样一旦我连接客户端,它就会停留在同一台机器上。这是因为socket.io以WebSocket和几个长轮询线程开始的方式,它们都需要在同一个后端服务器上才能正常工作。
您可以更改客户端连接选项以仅使用Websockets而不是粘性会话,这将消除与多个服务器的多个连接的问题,因为只有一个连接,即单个websocket。这也将使您的应用程序失去降级到长轮询而不是WebSockets的能力。