通过动态url参数负载平衡websocket连接

时间:2014-11-25 20:03:22

标签: node.js nginx websocket load-balancing phpwebsocket

为了扩展我们的实时应用程序,我们需要添加水平的Web套接字服务器。

每个用户通过包含groupId变量的网址进行连接:http://ws.example.com/ {groupId}。 该groupId是动态的,无法进行预测。

因此,许多用户共享同一个groupId。为了通过websocket服务器在它们之间进行通信,共享同一个groupId的每个用户必须位于同一个websocket服务器中。

我们希望实现一个负载平衡系统来平衡我们的websocket服务器。

- 如果客户端(userA)连接并且在serverA上存在具有相同groupId的另一个连接(userB),那么我们希望在服务器A上连接userA。

- 如果不存在与该groupId的现有连接,那么我们通过经典的负载平衡算法允许websocket服务器。

我们怎样才能做到这一点?我们的服务器目前在nginx上运行。

1 个答案:

答案 0 :(得分:0)

Websocket使用HTTP协商,但它不支持重定向(301或302)。因此,一旦您的用户连接,您必须检查它是否在正确的位置,否则发送一条消息,表明它必须连接到其他地方。

因此,您可以在这两者之间取得平衡serverA.whatever.comserverB.whatever.comws.whatever.com。然后,如果用户连接到ws://ws.whatever.com并且它是平衡的"到serverA.whatever.com,但因为url中的参数应该连接到另一个,你必须实现一些逻辑,所以服务器说{ messageType:"connection", message:"reconnect", location:"ws://serverB.whatever.com"},客户端理解消息并尝试重新连接到这样的"位置"。

这很痛苦,因为这意味着主持人必须知道他们自己的主机名。