通过动态 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.com
、serverB.whatever.com
和ws.whatever.com
之间的平衡。那么如果一个用户连接到ws://ws.whatever.com
并且它是“平衡的”到serverA.whatever.com
,但是因为url中的参数应该连接到另一个,你必须实现一些逻辑,所以服务器说 messageType:"connection", message:"reconnect", location:"ws://serverB.whatever.com"
,并且客户端理解该消息并尝试重新连接到这样的“位置”。
这很痛苦,因为这意味着主机必须知道自己的主机名。
【讨论】:
以上是关于通过动态 url 参数负载平衡 websocket 连接的主要内容,如果未能解决你的问题,请参考以下文章
Web Sockets + Tomcat/Glassfish + 集群 + 负载平衡 - 都有哪些选项?
我是不是需要在 DB 上进行会话集群以在 AWS/EC2 上使用 HAProxy 对 Jetty WebSockets 服务器进行负载平衡?