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

如何扩展支持长轮询的 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。

答案1

我不认为您的 60k 个客户端是真正的问题。您更有可能遇到文件描述符不足的问题,但这应该很容易作为操作系统配置的一部分进行修复。

这就是为什么连接不会成为您的问题的原因。每个连接都由其源 IP 地址、源端口、目标 IP 地址和目标端口表征。在网络堆栈内部,这四元组用于将数据包与文件描述符进行匹配(每个文件描述符代表一个连接)。您的服务器具有固定的目标 IP 地址和目标端口(您的服务器是其客户端的目标),但源 IP 地址和源端口是可变的。端口是一个 16 位数字,因此来自一个客户端的最大连接数为 64K。IPv4 地址是一个 32 位数字,它为您提供了 4,294,967,296 个可能的源地址。进行一些基本的数学运算,您的服务器可以有 64K * 4,294,967,296 个连接映射到单个源 IP 和端口。

这就是为什么您更有可能遇到与打开文件描述符的最大数量有关的问题,而不是与客户端数量有关的问题。

答案2

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

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

相关内容