负载均衡器是否打开了所有子服务器的套接字

does load balancer have all its child servers' sockets open

假设我有以下设置:

client (browser)-> load balancer (nginx) -> 10 nodejs servers

我正在使用 websocket (socket.io) 在客户端和服务器之间进行双向通信。

我的问题是:当客户端通过套接字发送消息时,负载均衡器是像普通的 http 请求一样简单地将套接字请求重定向到另一台服务器,还是发生了一些更复杂的事情,比如让套接字保持打开状态在客户端和服务器之间的整个 websocket 连接期间的负载平衡器机器。

因为如果以上为真,则意味着负载均衡器机器打开了其所有子服务器的 TCP 连接的总和,这意味着负载均衡器本身必须是一个相当大的机器,它不是 "entirely" 分配所有负载.. 最后我不得不担心负载均衡器机器上的 "running out of sockets"?

任何人都可以为我阐明整个概念吗?谢谢!

对于 websockets,是的,负载均衡器几乎肯定会为每个连接维护一个从客户端进出到服务器的 TCP 连接。然而,负载均衡器比实际处理客户端的服务器机器要做的工作少得多——它不必 "think" 关于协议或生成或解释任何有效负载,它只需要从复制数据一个管道连接到另一个管道,并在它们关闭时拆除连接。

使用事件驱动模型并可能使用 Linux 内核的 splice(2) 系统调用,"copied" 数据可以在内核 space 中的所有连接之间进行混洗, 以实现非常高效的操作。

对于给定的 IP 地址,设计良好的负载均衡器可能 运行 超过 ~64K address/port 对的 IPv4 限制,例如 CPU或记忆。

即使是正常的网络流量,平衡器根据请求和响应主体理解并做出路由决策,应用服务器通常仍然比平衡器有更多的工作要做。

有趣的是,我的基础设施中一些最小的机器是负载平衡器......它们 仍然 往往具有最小的工作负载,如内存所证明的那样,CPU, 和磁盘访问。