负载平衡websockets

时间:2012-09-21 07:45:11

标签: websocket load-balancing server-push

我有一个关于如何加载平衡网络套接字的问题。

我有一台支持网络套接字的服务器。浏览器连接到我的站点,每个浏览器打开一个到www.mydomain.com的Web套接字。这样,我的社交网络应用可以将消息推送给客户。

传统上,只使用HTTP请求,我会通过在两个Web服务器前添加第二个服务器和负载均衡器来扩展。

使用Web套接字时,连接必须直接与Web服务器连接,而不是负载均衡器,因为如果一台机器的物理限制为64k开放端口,并且客户端连接到负载均衡器,那么我就无法支持超过64,000个并发用户。

那我该如何 -

  1. 在页面加载时让客户端直接连接到Web服务器(而不是负载均衡器)?我是否只是从节点加载JavaScript,每次最初请求页面时,负载均衡器(或其他)会随机修改脚本的URL?

  2. 处理涟漪?当Web服务器关闭时,浏览器会注意到连接已关闭。我可以编写JavaScript代码来尝试重新打开连接,但该节点将会消失一段时间。所以我想我必须回到负载均衡器来查询下一个要使用的节点的地址?

  3. 我确实想知道负载均衡器在初始请求上发送重定向,因此浏览器最初请求www.mydomain.com并重定向到www34.mydomain.com。这很有效,直到节点出现故障 - 像Facebook这样的网站不这样做。他们是怎么做到的?

3 个答案:

答案 0 :(得分:74)

放置一个L3负载均衡器,将基​​于源IP地址哈希的IP数据包分发到您的WebSocket服务器场。由于L3平衡器不维持状态(使用散列源-IP端口),因此它将在低端硬件(例如10GbE)上扩展到线速。由于分发是确定性的(使用散列源-IP-port),因此它将与TCP(以及WebSocket)一起使用。

另请注意,64k硬限制仅适用于给定(源)IP地址的传出 TCP / IP。它不适用于传入的TCP / IP。我们在2核4GB RAM VM上测试了Autobahn(高性能WebSocket服务器),其中有200k个活动连接。

另请注意,您可以在初始WebSocket握手期间宣布的HTTP路径上执行L7负载平衡。在这种情况下,负载均衡器必须维持状态(哪个源IP端口对将进入哪个后端节点)。它可能会扩展到数以百万计的连接,但仍然可以通过合适的设置。

免责声明:我是Autobahn的原创作者并为Tavendo工作。

答案 1 :(得分:2)

您还可以通过检查和“路由功能”实现第7层负载平衡

请参阅“如何使用Stingray Traffic Manager检查和负载平衡WebSockets流量,并在必要时,如何管理在同一IP地址和端口上接收的WebSockets和HTTP流量。” https://splash.riverbed.com/docs/DOC-1451

答案 2 :(得分:2)

请注意,如果您的websocket服务器逻辑在带有socket.io的nodejs上运行,您可以告诉socket.io使用共享的redis键/值存储进行同步。 这样您甚至不必关心负载均衡器,事件将在服务器实例之间传播。

var io = require('socket.io')(3000);
var redis = require('socket.io-redis'); 
io.adapter(redis({ host: 'localhost', port: 6379 }));

请参阅:http://socket.io/docs/using-multiple-nodes/

但是在某些时候我猜redis会成为瓶颈......