【问题标题】:How do websocket connections work through a load balancer?websocket 连接如何通过负载均衡器工作?
【发布时间】:2021-03-18 07:31:40
【问题描述】:

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

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

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

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

关于这个的信息大家都忽略了这部分的解释。如果有人能解释我所缺少的,我将不胜感激。

【问题讨论】:

    标签: websocket load-balancing system-design


    【解决方案1】:

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

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

    • 反向代理的一个用例是向客户端隐藏服务器元信息(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

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

    【讨论】:

      猜你喜欢
      • 2018-04-13
      • 2020-04-17
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多