为了扩展我们的实时应用程序,我们需要添加水平的Web套接字服务器。
每个用户通过包含groupId变量的网址进行连接:http://ws.example.com/ {groupId}。 该groupId是动态的,无法进行预测。
因此,许多用户共享同一个groupId。为了通过websocket服务器在它们之间进行通信,共享同一个groupId的每个用户必须位于同一个websocket服务器中。
我们希望实现一个负载平衡系统来平衡我们的websocket服务器。
- 如果客户端(userA)连接并且在serverA上存在具有相同groupId的另一个连接(userB),那么我们希望在服务器A上连接userA。
- 如果不存在与该groupId的现有连接,那么我们通过经典的负载平衡算法允许websocket服务器。
我们怎样才能做到这一点?我们的服务器目前在nginx上运行。
答案 0 :(得分:0)
Websocket使用HTTP协商,但它不支持重定向(301或302)。因此,一旦您的用户连接,您必须检查它是否在正确的位置,否则发送一条消息,表明它必须连接到其他地方。
因此,您可以在这两者之间取得平衡serverA.whatever.com
,serverB.whatever.com
和ws.whatever.com
。然后,如果用户连接到ws://ws.whatever.com
并且它是平衡的"到serverA.whatever.com
,但因为url中的参数应该连接到另一个,你必须实现一些逻辑,所以服务器说{ messageType:"connection", message:"reconnect", location:"ws://serverB.whatever.com"}
,客户端理解消息并尝试重新连接到这样的"位置"。
这很痛苦,因为这意味着主持人必须知道他们自己的主机名。