首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >负载平衡web套接字

负载平衡web套接字
EN

Stack Overflow用户
提问于 2012-09-21 15:45:11
回答 3查看 59.7K关注 0票数 121

我有一个关于如何负载均衡web socket的问题。

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

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

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

所以我该怎么-

  1. 让客户端在页面加载时直接连接到web服务器(而不是负载均衡器)?我是不是简单地从一个节点加载JavaScript,然后负载均衡器(或其他什么)在每次页面开始时随机修改脚本的URL?浏览器会注意到,当web服务器关闭时,连接也会关闭。我可以编写JavaScript代码来尝试重新打开连接,但是节点会消失一段时间。因此,我猜我将不得不回到负载均衡器来查询要使用的下一个节点的地址?
  2. 我确实想知道负载均衡器在初始请求时发送重定向,以便浏览器最初请求www.mydomain.com并被重定向到www34.mydomain.com。这非常有效,直到节点出现故障--而像Facebook这样的网站不会这样做。他们是怎么做到的?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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工作。

票数 109
EN

Stack Overflow用户

发布于 2016-08-31 21:14:40

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

代码语言:javascript
复制
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可能会成为瓶颈...

票数 4
EN

Stack Overflow用户

发布于 2013-10-22 00:44:30

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12526265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档