我有一个关于如何负载均衡web socket的问题。
我有一个支持web socket的服务器。浏览器连接到我的网站,每个浏览器都会打开一个连接到www.mydomain.com
的web套接字。这样,我的社交网络应用程序就可以将消息推送到客户端。
传统上,只使用HTTP请求,我会通过在两个web服务器前面添加第二个服务器和一个负载均衡器来进行扩展。
使用web套接字,连接必须直接与web服务器,而不是负载均衡器,因为如果一台机器有一个物理限制,比如说64k开放端口,而客户端连接到负载均衡器,那么我不能支持超过64k的并发用户。
所以我该怎么-
www.mydomain.com
并被重定向到www34.mydomain.com
。这非常有效,直到节点出现故障--而像Facebook这样的网站不会这样做。他们是怎么做到的?发布于 2012-09-21 16:27:37
放置一个根据源IP端口散列将IP数据包分发到您的WebSocket服务器场的L3负载均衡器。由于L3均衡器不维护任何状态(使用散列的源IP端口),因此它将在低端硬件(例如10GbE)上扩展到线速。由于分布是确定性的(使用散列源-IP-端口),它将与TCP一起工作(因此也适用于WebSocket)。
另请注意,64k硬限制仅适用于给定(源) IP地址的传出TCP/IP。它不适用于传入的TCP/IP。我们已经在一个2核、4 4GB内存的VM上测试了Autobahn (一种高性能WebSocket服务器),它具有200k活动连接。
还要注意,您可以在初始WebSocket握手期间宣布的HTTP路径上进行L7负载平衡。在这种情况下,负载均衡器必须维护状态(哪个源IP端口对将去往哪个后端节点)。然而,在良好的设置下,它可能会扩展到数百万个连接。
免责声明:我是Autobahn的原始作者,并为Tavendo工作。
发布于 2016-08-31 21:14:40
请注意,如果您的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可能会成为瓶颈...
发布于 2013-10-22 00:44:30
您还可以通过检查和“路由功能”实现第7层负载平衡。
请参阅“如何使用Stingray traffic Manager检查WebSockets流量并对其进行负载平衡,以及在必要时如何管理在同一IP地址和端口上接收的WebSockets和HTTP流量”。https://splash.riverbed.com/docs/DOC-1451
https://stackoverflow.com/questions/12526265
复制相似问题