Frage

Ich bin der Gestaltung einer Anwendung, bei der viele Clients an einen zentralen Server verbinden. Dieser Server hält diese Verbindungen, das Senden von Keep-Alive jede halbe Stunde. Der Server verfügt über einen integrierten HTTP-Server, die eine Schnittstelle zu den Client-Verbindungen bieten (ex http:. // server / IsClientConnected ? id = id ). Ich frage mich, was der beste Weg, um dies zu realisieren ist. Meine aktuelle Implementierung ist in Java, und ich habe nur eine Karte mit IDs als Schlüssel, aber ein Thread für jede Verbindung gestartet wird, und ich weiß nicht, ob dies wirklich der beste Weg, dies zu tun. Alle Hinweise würden geschätzt.
Danke,
Isaac Waller

War es hilfreich?

Lösung

Mit dem java.nio Paket, wie auf dieser Seite beschrieben: Gebäude Highly Scalable Server mit Java NIO . Lesen Sie auch diese Seite sehr sorgfältig: Architektur eines Highly Scalable NIO-Based Server .

Persönlich würde ich nicht mit dem NIO Interna stören und einen Rahmen verwenden, wie Apache MINA oder xSocket . NIO ist kompliziert und einfach in sehr schwer nachvollziehbarer Weise falsch zu bekommen. Wenn Sie es haben wollen „einfach funktionieren“, dann einen Rahmen verwenden.

Andere Tipps

Mit einem einzigen Thread pro Verbindung, die Sie in der Regel auf etwa 10.000 Verbindungen auf einem einzigen Rechner skalieren. Für eine 32 Windows-Maschine, werden Sie wahrscheinlich eine Grenze rund 1.000 Verbindungen getroffen.

Um dies zu vermeiden, können Sie entweder das Design Ihres Programms ändern, oder Sie können (horizontal) skalieren. Sie haben die Kosten der Entwicklung mit den Kosten der Hardware gewichten.

Der einzelne Thread pro Benutzer, mit einer einzigen durchgehenden Verbindung ist in der Regel das einfachste Programmiermodell. Ich würde mit diesem Modell bleiben, bis Sie die Grenzen Ihrer aktuellen Hardware erreichen. An diesem Punkt würde ich entscheiden, entweder den Code zu ändern, oder mehr Hardware hinzuzufügen.

Wenn die Clients für längere Zeit verbunden werden, ein Thread pro Client Zuweisung problematisch sein kann. Jeder Thread auf dem Server erfordert eine bestimmte Menge an Ressourcen (Speicher für den Stapel, zum Beispiel).

könnten Sie verwenden Jetty Fortsetzungen die Client-Anforderung mit weniger Threads zu handhaben, indem Sie asynchron-Servlets.

Lesen Sie mehr über das das Reactor. Es ist eine Implementierung für die in Java (es verwendet Kanäle statt Thread für Client). Es ist einfach zu implementieren und sehr effizient.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top