负载平衡networking套接字

我有一个关于如何负载平衡Web套接字的问题。

我有一个支持networking套接字的服务器。 浏览器连接到我的网站,每个人打开一个networking套接字www.mydomain.com 。 这样,我的社交networking应用程序可以推送消息到客户端。

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

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

那么我该如何 –

  1. 当页面加载时,让客户端直接连接到Web服务器(而不是负载平衡器)? 我是否简单地从节点加载JavaScript,并且每次页面被初始请求时,负载平衡器(或其他)随机地修改脚本的URL?

  2. 处理一个波纹开始? 浏览器会注意到在Web服务器closures时连接被closures。 我可以编写JavaScript代码尝试重新打开连接,但该节点将消失一段时间。 所以我想我将不得不回到负载平衡器查询下一个节点的地址使用?

  3. 我想知道负载平衡器在初始请求时发送redirect,以便浏览器最初请求www.mydomain.com并被redirect到www34.mydomain.com 。 这很好,直到节点崩溃 – 像Facebook这样的网站不这样做。 他们是如何做到的呢?

放置一个L3负载均衡器,将基​​于源IP端口哈希的IP数据包分发到您的WebSocket服务器场。 由于L3平衡器保持无状态(使用哈希源IP端口),它将在低端硬件(比如10GbE)上扩展到线速。 由于分布是确定性的(使用散列源IP端口),它将与TCP(因此也就是WebSocket)一起工作。

另请注意,64k硬限制仅适用于给定(源)IP地址的传出 TCP / IP。 它不适用于传入的TCP / IP。 我们已经testing了在2核4GB内存虚拟机上具有200k活动连接的Autobahn (高性能WebSocket服务器)。

另外请注意,您可以在初始WebSocket握手期间宣布的HTTPpath上执行L7负载平衡。 在这种情况下,负载平衡器必须保持状态(哪个源IP端口对要传送到哪个后端节点)。 尽pipe如此,体面的设置可能会扩展到数百万的连接。

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

还有其他方法,如基于DNS的负载平衡或使用基于http的编排服务器。 我试图在https://deepstream.io/blog/load-balancing-websocket-connections/上总结每种方法的优缺点;

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

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

请注意,如果您的websocket服务器逻辑在带有socket.io的nodej上运行,则可以告知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会成为瓶颈。