Websocket 负载平衡web套接字

Websocket 负载平衡web套接字,websocket,load-balancing,server-push,Websocket,Load Balancing,Server Push,我有一个关于如何平衡web套接字的问题 我有一个支持web套接字的服务器。浏览器连接到我的网站,每个浏览器打开一个web套接字,指向www.mydomain.com。这样,我的社交网络应用程序就可以将消息推送到客户端 传统上,仅使用HTTP请求,我会通过在两个web服务器前面添加第二个服务器和负载平衡器来扩大规模 使用web套接字时,连接必须直接与web服务器连接,而不是与负载平衡器连接,因为如果一台机器的物理限制为64k开放端口,并且客户端连接到负载平衡器,那么我不能支持超过64k的并发用户

我有一个关于如何平衡web套接字的问题

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

传统上,仅使用HTTP请求,我会通过在两个web服务器前面添加第二个服务器和负载平衡器来扩大规模

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

那我该怎么做呢-

  • 让客户端在页面加载时直接连接到web服务器(而不是负载平衡器)?我是否只是从一个节点加载JavaScript,并且每次请求页面时,负载平衡器(或其他什么)都会随机修改脚本的URL

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

  • 我确实想知道负载平衡器是否会在初始请求时发送重定向,以便浏览器最初请求
    www.mydomain.com
    ,然后重定向到
    www34.mydomain.com
    。这一点非常有效,直到节点关闭——而像Facebook这样的网站不会这样做。他们是怎么做到的


  • 放置一个L3负载平衡器,该平衡器基于源IP端口哈希将IP数据包分发到WebSocket服务器场。由于L3平衡器不保持任何状态(使用哈希源IP端口),因此它将根据低端硬件(比如10GbE)上的网速进行扩展。由于分发是确定性的(使用哈希源IP端口),因此它将与TCP(以及WebSocket)一起工作

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

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


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

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


    请参阅“如何使用Stingray traffic Manager检查和负载平衡websocket流量,以及在必要时如何管理在同一IP地址和端口上接收的websocket和HTTP流量”。请注意,如果您的websocket服务器逻辑在具有socket.io的NodeJ上运行,您可以告诉socket.io使用共享redis键/值存储进行同步。 这样,您甚至不必关心负载平衡器,事件将在服务器实例之间传播

    var io=require('socket.io')(3000);
    var redis=require('socket.io redis');
    适配器(redis({host:'localhost',端口:6379}));
    
    见:


    但在某个时候,我想redis可能会成为瓶颈…

    您可以在网络层进行负载平衡,正如所建议的那样,还有其他方法,如基于DNS的负载平衡或使用基于http的编排服务器。我试图总结一下@wolframhempel Link中每种方法的利弊-(因此,当我用javascript创建web套接字时,我会从负载平衡器URL加载我的javascript库,并给出负载平衡器URL-你的意思是它对浏览器是透明的?这很酷!是的,只有1个URL,后者的主机名应该解析为负载平衡器。WebSocket后端服务器有内部IP(非公开),也可以在与公共端口不同的端口上运行。唯一需要注意的是,您可能需要告诉WebSocket服务器其公共可见主机名IP端口是什么,因为符合要求的WebSocket服务器将检查WS-handshake的HTTP头中提供的URL是否与它们正在侦听的主机名/IP/端口相匹配。我不知道有很多websocket连接需要平衡,但我在一个连接中有很多流量,或者说只有很少的连接。为了简单起见,现在说一个连接如何平衡通过一个web套接字连接的请求?当我在java websocket中建立更多连接5000+时,它不会释放内存…有什么解决方案吗?因为10 GbE较低2012年的d hardware?LOLI不得不做一些调查来找到你链接的信息。wayback机器帮助我找到了那篇文章的一个实时副本: