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

Posted

技术标签:

【中文标题】通过动态 url 参数负载平衡 websocket 连接【英文标题】:Load balance websocket connection via dynamic url parameter 【发布时间】:2014-11-25 20:03:21 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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",并且客户端理解该消息并尝试重新连接到这样的“位置”。

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

【讨论】:

以上是关于通过动态 url 参数负载平衡 websocket 连接的主要内容,如果未能解决你的问题,请参考以下文章

AWS EC2 上的 Websocket 负载平衡

谷歌HTTP负载平衡器无法升级的Web Socket连接

WebSockets 和 HTTPS 负载均衡器

Web Sockets + Tomcat/Glassfish + 集群 + 负载平衡 - 都有哪些选项?

我是不是需要在 DB 上进行会话集群以在 AWS/EC2 上使用 HAProxy 对 Jetty WebSockets 服务器进行负载平衡?

Apache ProxyPass 负载平衡所有 URL