我的情况是,我们目前编写了一个在线应用程序,它在服务器端与Node.js侦听器一起使用WebSocket。我们有两个不同的部分:一个提供页面并使用node.js和express+ejs,另一个是完全不同的应用程序,它只包含websockets的socket.io库。因此,我们将讨论websockets的可伸缩性问题。
我们发现的一个解决方案是在服务器之间使用redis和共享套接字信息,但由于体系结构的原因,需要共享大量其他信息,这将在服务器上造成巨大的开销。
在这篇介绍之后,我的问题是--是否可以为websockets使用基于cookie的负载平衡?因此,假设用户与cookie server=server1的每个连接都将被转发到server1,与cookie server=server2的每个连接都将被fw转发到server2,而没有cookie的连接将被fw转发到最不繁忙的服务器。
更新:正如一个“答案”所说--是的,我知道这是存在的。只是不记得那个名字是粘粘的会话。但问题是--这对websockets有用吗?有什么可能的并发症吗?
发布于 2012-08-08 20:36:31
我们的Node.js生产堆栈中也出现了类似的问题。我们有两台使用WebSockets的服务器,用于正常用例,但偶尔负载均衡器会在这两台服务器之间弹起这些连接,从而导致问题。(我们在后端设置了会话代码,应该已经修复了它,但是没有正确地处理它。)
我们尝试在这些服务器前面的梭子鱼负载均衡器上启用Sticky会话,但发现由于它的工作方式,它会阻塞WebSocket通信量。我没有确切地研究为什么,因为网上几乎没有可用的信息,但这似乎是由于平衡器如何剥离HTTP请求的头,抓取cookie,并将请求转发到正确的后端服务器。由于WebSockets从HTTP开始,然后升级,负载均衡器没有注意到连接中的差异,因此将尝试执行相同的HTTP处理。这将导致WebSocket连接失败,从而断开用户的连接。
以下是我们目前正在进行的工作非常顺利的内容。我们仍然在后端服务器前面使用Barracuda负载平衡器,但是在负载平衡器上没有启用Sticky会话。在我们的后端服务器上,应用服务器前面是HAProxy,它正确地支持WebSockets,可以以“迂回”的方式提供Sticky会话。
请求流列表
请求流图
WebSocket Request /--> Barracuda 1 -->\ /--> Host 1 -->\ /--> App 1
-------------------> --> -->
\--> Barracuda 2 -->/ \--> Host 2 -->/ \--> App 1当箭头返回到一个请求时,这意味着请求可以流到流中的任一点。
HAProxy配置详细信息
backend app_1
cookie ha_app_1 insert
server host1 10.0.0.101:80011 weight 1 maxconn 1024 cookie host_1 check
server host2 10.0.0.102:80011 weight 1 maxconn 1024 cookie host_2 check在上述配置中:
cookie ha_app_1 insert是实际使用的cookie名称。cookie host_1 check或cookie host_2 check设置cookie值https://stackoverflow.com/questions/11651484
复制相似问题