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

the*_*may 6 load-balancing system-design websocket

请原谅我的无知,因为我在负载均衡器和 websockets 方面的经验有限。我试图了解客户端如何通过 websockets 连接到位于负载均衡器后面的服务器集群。

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

现在将 websockets 添加到组合中。如果客户端尝试通过 websockets 进行通信。负载均衡器不需要打开 2 个 websockets 连接吗?一个与客户端,一个与服务器?这听起来不会扩展,除非还有一组负载平衡器。

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

看到的有关这方面的信息都忽略了这部分的解释。如果有人能解释我遗漏了什么,我将不胜感激。

Sum*_*ani 12

负载均衡器和反向代理具有不同的用例。

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

  • 反向代理的用例之一是向客户端隐藏服务器元信息(IP、端口等)。这是某种安全保障。

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

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

由于其用例和限制,处理 WebSocket 负载或在 websocket 节点(集群中)中分配负载是一个非常复杂的实现。

为什么这么复杂:

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

  2. 您在服务器中打开 WebSocket 连接有限制(默认为 63k)。您可以通过内核级别的某些设置来扩展它,然后您需要在系统资源上做出妥协

澄清你的疑问:如果你把WebSocket放在负载均衡器后面,那么WebSocket将通过负载均衡器从客户端进行通信,并且客户端将与负载均衡器进行通信。

如果每个客户端请求都会打开两个 WebSocket 连接(假设负载均衡器中有一个节点),则不会使用负载均衡器并导致响应不一致(如果您认为聊天应用程序是如何工作的)

在将负载分配到 WebSocket 服务器的情况下,您将在其中放置负载均衡器:

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

如果您将负载均衡器放在 L7(应用程序层)中,则负载均衡器必须保持状态(哪个源 IP 端口对将前往哪个后端节点)。这对资源不利。

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


我建议查看一些聊天消息系统设计架构,HTTP(Keep-Alive)与 Websocket,如何使用 WebSocket 发布/订阅(它可以很好地扩展 WebSocket) 这个博客提供了关于如何为多个用户扩展 WebSocket 的好方法: https ://hackernoon.com/scaling-websockets-9a31497af051

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