Linux

如何擴展支持長輪詢的 Web 伺服器

  • December 29, 2013

我計劃添加更多的 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。

我不認為你的 60k 客戶是真正的問題。您很可能會遇到文件描述符不足的問題,但這應該很容易作為作業系統配置的一部分進行修復。

這就是為什麼連接不會成為您的問題。每個連接都有其源IP地址、源埠、目的IP地址和目的埠的特徵。在網路堆棧內部,這個四元組用於將數據包與文件描述符匹配(每個文件描述符代表一個連接)。您的伺服器具有固定的目標 IP 地址和目標埠(您的伺服器是其客戶端的目標),但源 IP 地址和源埠是可變的。埠是 16 位數字,因此來自一個客戶端的最大連接數為 64K。IPv4 地址是一個 32 位數字,可為您提供 4,294,967,296 個可能的源地址。做一些基本的數學運算,您的伺服器可能有 64K * 4,294,967,296 個連接映射到單個源 ip 和埠。

這就是為什麼您更可能遇到打開文件描述符的最大數量而不是客戶端數量的問題。

引用自:https://serverfault.com/questions/562701