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