假设我有以下设置:
client (browser)-> load balancer (nginx) -> 10 nodejs servers
我使用websocket(socket.io
)在客户端和服务器之间进行双向通信。
我的问题是:当客户端通过套接字发送消息时,负载均衡器是像普通的http请求一样简单地将套接字请求重定向到另一台服务器,还是正在进行更复杂的事情,比如在客户端和服务器之间的整个websocket连接期间,使套接字在负载均衡器机器上保持打开。
因为如果以上是真的,这意味着负载平衡器机器打开了其所有子服务器的TCP连接的总和,这意味着您负载平衡器必须是一台相当大的机器,并且它并不是"完全"分配所有负载。。最终我不得不担心负载平衡器机器上的"套接字用完"?
有人能为我澄清整个概念吗?谢谢
对于websocket,是的,负载均衡器几乎肯定会为每个连接维护从客户端到服务器的TCP连接。然而,与实际处理客户端的服务器机器相比,负载均衡器要做的工作要少得多——它不必"思考"协议,也不必生成或解释任何有效负载,只需将数据从一个管道复制到另一个管道,并在连接关闭时拆除连接。
使用事件驱动的模型,并可能使用Linux内核的splice(2)系统调用,"复制"的数据可以在内核空间中的连接之间进行混洗,以实现非常高效的操作。
对于给定的IP地址,一个设计良好的负载均衡器与任何其他资源(如CPU或内存)一样,可能会遇到约64K地址/端口对的IPv4限制。
即使在正常的网络流量下,平衡器也会根据请求和响应主体来理解和做出路由决策,应用程序服务器通常仍比平衡器有更多的工作要做。
有趣的是,我的基础设施中一些最小的机器是负载平衡器。。。它们仍然倾向于具有最小的工作负载,这可以从内存、CPU和磁盘访问中得到证明。