如何扩展支持长轮询的Web服务器

我打算添加更多Web应用程序服务器来支持日益增长的客户端,部署HAproxy和Keepalived以实现负载平衡和高可用性

我的服务器使用情况具有以下特征:

  1. 作业不是CPU密集型的。 消息是小于100个字符的JSON文本。
  2. 用户将通过客户端设备Y发送消息到服务器。通常每天4-5个消息
  3. 客户端设备X持续等待来自服务器的消息 如果消息在服务器上可用,则客户端设备X必须能够在2秒内得到它。 否则,此消息已过时。

出于这样的原因,

  1. 客户端设备X正在使用长轮询HTTP连接来响应。 每个连接将持续5秒钟并重新连接。
  2. 客户端设备X和客户端设备Y连接到同一台服务器,因此X和Y可以轻松发送消息

如果有超过60,000个客户端设备X连接到服务器,则我的负载均衡器或路由器将用尽TCP端口。 扩大20,000名用户的最佳方式是什么?

我的服务器在Ubuntu服务器上运行,使用tomcat和Java Servlet。

我不认为你的6万客户是真正的问题。 你会更可能有没有足够的文件描述符的问题,但这应该很容易解决作为操作系统configuration的一部分。

这就是为什么连接不会成为你的问题。 每个连接的特征在于其源IP地址,源端口,目的IP地址和目的端口。 在networking堆栈中,这个四元组用于将数据包与文件描述符(每个文件描述符代表一个连接)进行匹配。 你的服务器有固定的目的IP地址和目的端口(你的服务器是客户端的目的地址),但源IP地址和源端口是可变的。 端口是16位数字,因此来自一个客户端的最大连接数是64K。 IPv4地址是一个32位的数字,它给你4,294,967,296个可能的源地址。 做一些基本的math计算,你的服务器可以把64K * 4,294,967,296连接映射到一个单一的源IP和端口。

这就是为什么你会更可能有最大数量的打开文件描述符,然后是客户端数量的问题。

最简单的方法可能是在DNS级别实现负载平衡。

意思是:有一个循环的DNS条目,可以平衡到2,3或更多物理负载均衡器。