Ich plane, weitere Web-Anwendungsserver hinzuzufügen, um die zunehmende Anzahl an Clients zu unterstützen und HAproxy und Keepalived für Lastausgleich und hohe Verfügbarkeit einzusetzen.
Meine Servernutzung weist folgende Besonderheit auf:
- Jobs sind nicht CPU-intensiv. Nachrichten sind JSON-Texte mit weniger als 100 Zeichen.
- Benutzer senden Nachrichten über Client-Gerät Y an den Server. Normalerweise 4-5 Nachrichten pro Tag
- Client-Geräte X warten weiterhin auf eine Nachricht vom Server. Wenn die Nachricht auf dem Server verfügbar ist, muss Client-Gerät X sie innerhalb von 2 Sekunden abrufen können. Andernfalls ist diese Nachricht veraltet.
Aus diesem Grund,
- Client-Geräte, die X verwendetLange Polling-HTTP-Verbindungum reagieren zu können. Jede Verbindung dauert 5 Sekunden und wird dann wiederhergestellt.
- Client-Geräte X und Client-Geräte Y sind mit demselben Server verbunden, sodass X und Y problemlos Nachrichten senden können.
Frage
Wenn über 60.000 Client-Geräte X eine Verbindung zum Server herstellen, ist der TCP-Port meines Load Balancers oder Routers erschöpft. Was ist die beste Möglichkeit, um beispielsweise 20.000 Benutzer hochzuskalieren?
Mein Server läuft auf einem Ubuntu-Server und verwendet Tomcat und Java Servlet.
Antwort1
Ich glaube nicht, dass Ihre 60.000 Clients das eigentliche Problem sind. Sie werden eher ein Problem mit nicht genügend Dateideskriptoren haben, aber das sollte sich im Rahmen der Betriebssystemkonfiguration leicht beheben lassen.
Deshalb werden Verbindungen nicht Ihr Problem sein. Jede Verbindung ist durch ihre Quell-IP-Adresse, ihren Quellport, ihre Ziel-IP-Adresse und ihren Zielport gekennzeichnet. Innerhalb des Netzwerkstapels wird dieses Vierfache verwendet, um Pakete Dateideskriptoren zuzuordnen (jeder Dateideskriptor stellt eine Verbindung dar). Ihr Server hat eine feste Ziel-IP-Adresse und einen festen Zielport (Ihr Server ist das Ziel für dessen Client), aber Quell-IP-Adresse und Quellport sind variabel. Der Port ist eine 16-Bit-Zahl, daher beträgt die maximale Anzahl von Verbindungen von einem Client 64K. Die IPv4-Adresse ist eine 32-Bit-Zahl, die Ihnen 4.294.967.296 mögliche Quelladressen gibt. Mit ein wenig einfacher Mathematik könnte Ihr Server 64K * 4.294.967.296 Verbindungen haben, die einer einzigen Quell-IP und einem einzigen Quellport zugeordnet sind.
Aus diesem Grund werden Sie eher Probleme mit der maximalen Anzahl geöffneter Dateideskriptoren haben als mit der Anzahl der Clients.
Antwort2
Der einfachste Ansatz dürfte darin bestehen, den Lastenausgleich auf DNS-Ebene zu implementieren.
Bedeutet: Sie benötigen einen Round-Robin-DNS-Eintrag, der für den Ausgleich auf 2, 3 oder mehr physische Load Balancer sorgt.