websocket连接如何通过负载平衡器工作?

websocket连接如何通过负载平衡器工作?,websocket,load-balancing,system-design,Websocket,Load Balancing,System Design,请原谅我的无知,因为我使用负载平衡器和WebSocket的经验有限。我试图理解客户端如何通过WebSocket连接到负载平衡器后面的服务器集群 我对负载平衡器的理解是,它们就像反向代理。它们接收来自客户端的请求,将它们路由到集群中的服务器,当服务器回复到负载平衡器时,负载平衡器将该信息中继到客户端。在这方面,他们就像一个中间人,在服务器和客户端之间打电话 现在将WebSocket添加到混合中。如果客户端试图通过WebSocket进行通信。负载平衡器不需要打开2个WebSocket连接吗?一个是客

请原谅我的无知,因为我使用负载平衡器和WebSocket的经验有限。我试图理解客户端如何通过WebSocket连接到负载平衡器后面的服务器集群

我对负载平衡器的理解是,它们就像反向代理。它们接收来自客户端的请求,将它们路由到集群中的服务器,当服务器回复到负载平衡器时,负载平衡器将该信息中继到客户端。在这方面,他们就像一个中间人,在服务器和客户端之间打电话

现在将WebSocket添加到混合中。如果客户端试图通过WebSocket进行通信。负载平衡器不需要打开2个WebSocket连接吗?一个是客户端,一个是服务器?这听起来不像是可以扩展的,除非还有一个负载平衡器集群

我的第二个猜测是,负载平衡器并不是真正的“中继”信息,它们只是一个路由器,为客户机提供服务器的IP,然后在服务器和客户机之间直接进行通信


关于这一点的信息似乎都忽略了解释的这一部分。如果有人能解释我遗漏了什么,我将不胜感激。

负载平衡器和反向代理有不同的用例

  • 负载平衡器的主要使用情形是在服务器组中的节点之间分配负载,以管理每个节点的资源利用率

  • 反向代理的一个用例是对客户端隐藏服务器元信息(ip、端口等)。这是某种安全措施

我们可以使用负载平衡器配置反向代理,也可以单独配置反向代理

为单个节点配置负载平衡器没有意义,但我们可以为单个节点配置反向代理

处理WebSocket负载或在WebSocket节点(集群中)中分配负载是一个非常复杂的实现,因为它的用例和局限性

为什么这么复杂:

  • WebSocket是粘性连接,一旦连接,只要应用程序处于活动状态,就会保持连接

  • 在服务器中打开WebSocket连接有一个限制(默认值为63k)。您可以通过内核级别的一些设置来扩展它,然后您需要对系统资源进行折衷

  • 澄清您的疑问:如果您将WebSocket放在负载平衡器后面, 然后WebSocket将通过来自客户端的负载平衡器进行通信,客户端将与负载平衡器进行通信

    如果每个客户端请求将打开两个WebSocket连接(假设负载平衡器中有一个节点),那么负载平衡器就没有用处,导致响应不一致(如果您认为,您的聊天应用程序是如何工作的)

    将负载分配到WebSocket服务器时,您将在其中放置负载平衡器:

    如果您将负载平衡器置于L3(网络层),那么您的请求将根据您的IP地址进行分发。 网络层的服务将生成IP地址的散列,并将请求发送到相应的WebSocket服务器(一致散列)。网络层不会维护请求的状态

    如果将负载平衡器置于L7(应用层),那么负载平衡器必须保持一个状态(哪个源IP端口对将连接到哪个后端节点)。这对资源不利

    我希望我能澄清你们中的一些人的疑虑


    我建议看一些聊天信息系统设计架构,HTTP(Keep Alive)与Websocket,如何使用Websocket发布/订阅(它可以很好地扩展Websocket) 本博客提供了一个很好的方法,可以为多个用户扩展WebSocket:

    不要错过nginix,它是分布式系统设计的好站点