使用websockets和持久的TCP连接如果负载均衡器处理后端的大型服务器场,负载均衡器将如何应对64k端口限制? 需要。 someideas设置一个应用程序,可以。 可能有10万个连接。
你的问题似乎假设翻译负载平衡器的SNAT(又名NAPT)。 以下是解决64k临时端口问题的一些想法。 我的经验是使用F5 Networks的BIG-IP产品(所以链接到他们的站点),但其他厂商的概念是相同的:
不要SNAT。 如果源端口没有被翻译,则不会有64k的限制。 要closuresSNAT,需要将负载均衡器的内部地址设置为内部服务器上的路由(通常是默认路由)。
使用SNAT池 。 这使得负载均衡器可以使用内部IP地址池来转换。 例如,一个SNAT池中的两个IP地址将为您提供128k个短暂端口,因此128k个并发TCP连接。
更高级的方法:
我应该指出,对于传统的HTTP负载均衡器来说,Websockets是一个特殊的挑战,因为连接的寿命更长 – 人们确实遇到了以前从未有过的短暂端口问题。 在我看来,最好的解决scheme是去除SNAT要求(上面的第一个或第三个解决scheme)。 缩放得到了很大的改善,负载平衡器上的负载也降低了。 增加的复杂性是值得的。
这里是关于这个问题的一个很好的文章,来自F5的Lori MacVittie: HTML5 Web Sockets改变了可伸缩性游戏
请记住,套接字是sec / dst地址,src / dst端口和协议的一个元组,因此排列的数量远远多于64k。 在某些情况下,代理服务器上的出站连接可能具有基于特定实现的问题,但端口编号传统上并不是一个大问题。
我在StackOverflow上find了最详细的答案 。
我知道这个问题是旧的,但我有一些事情要添加,以防别人google“WebSockets负载平衡器”…
WebSockets不需要负载平衡器。 在那里,我说了。 原因是浏览器不加载出站WebSocket连接,直到加载页面。
因此,如果页面已经完成加载,并且您有权访问执行JavaScript,那么为什么在这个世界上您需要一个负载均衡器? 你不会的。 你可以做一些简单的事情,比如从数组中随机select一个ws://或者wss://连接,或者你可以想象一下,做一个AJAX调用,返回一个特定的WebSocket服务器来连接。 您甚至可以通过模板将WebSocket URL从服务器端代码放入页面。
扩大WebSocket应用程序是微不足道的…只需添加更多的服务器。 只要你这样做,只需将它们添加到您的出站连接列表。 他们可以位于世界任何地方 – 即使在不同的领域/起源!
WebSocket不具有常规HTTP(S)URL的交叉源限制。 从http://bar.com连接到wss:://foo.com。 它会正常工作! WebSockets解决了与扩展Web应用程序相关的所有传统问题。 连接build立后,您甚至可以通过WebSocket提供CSS,图像,JavaScript和其他任何内容(现在也可以在浏览器中本地caching这些文件!)。 将负载平衡器和诸如CDN之类的东西过时。