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

Mic*_*key 7 linux ubuntu tomcat high-availability load-balancing

我计划添加更多 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

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

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

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