Socket Viele Clients bedienen mit Vert.x

Pharadox

Mitglied
Guten Abend in die Runde,

momentan habe ich Schwierigkeiten, eine gute Richtung bzw. Design einer Serverstruktur für eine problemlose Kommunikation vieler Clients, welche mobil online sind (Abbrüche drohen) und den oder die Server dann mit Anfragen bombardieren. Eventuell hilft soetwas ausgereiftes wie Netty oder Vert.x bei der ganzen Problematik?

GYmpKT2.png


So wie ich mir das bisher ausgedacht habe:
Server
Eine Java-Applikation lauscht an einem Port auf eintreffende Verbindungen und delegiert diese an leere Threads oder erstellt pro Verbindung einen neuen. Dafür nutzt die Applikation diese Non-Blocking I/O für die Sockets, um die Anfragen asynchron abhandeln zu können (Dazu muss ich mir noch einiges durchlesen, da noch nicht ganz verstanden. Vor allem Wiederaufnahme einer abgebrochenen Verbindung, wenn z.B. in Verbindung 1 nur ein Teil des Requests eintrifft und der restliche in Verbindung 2 und anschließend erst die vollständig gesendeten Informationen der Client-App vorliegen. Eventuell erübrigt sich das, dank Vert.x oder Netty).
Werden es zuviele Verbindungen (ich rechne vorsorglich mit 1Mio), werden keine neuen Threads mehr erzeugt, um der Gefahr eines Absturzes zu verhindern und die Verbindung landet in einer Warteschlange. (Was schlecht wäre, da die Client-App schon schnell die Information braucht)
1. Java Applikation startet
2. Prüft, wieviele CPU Kerne und Memory zur Verfügung stehen
3. Erzeugt auf Basis dessen mehrere wartende Threads und ein Maximum an erlaubten
4. Eine Warteschlange wird erzeugt
5. Thread, der nur für die Verbindungsdelegation erstellt wurde, lauscht an einem Port und delegiert eingetroffene Verbindungen an Threads zur Abarbeitung


Den Ablauf der Kommunikation denke ich mir so:
1. App nimmt Verbindung mit Server auf (im gesendeten Paket ist gleich die Information enthalten, was die App vom Server möchte, also ob Login, Registrierung, Daten)
2. Server nimmt die Verbindung an, wenn Client-App sich mittels validen Login vorher authentifiziert und dadurch quasi eine Session erhalten hat, die für einen bestimmten Zeitraum gültig ist, falls die App in wenigen Minuten oder ein paar Stunden erneut eine Anfrage tätigt und somit nicht erneut den Authentifizierungsvorgang starten muss
3. Server verarbeitet (zieht die Daten aus der DB) den Request und hält solange die Verbindung (damit nicht zu lange, Timeout?) bis der Client satt ist.

Ich habe bei Vert.x gesehen, dass es sehr viele Componenten gibt, wodurch auch eine direkte Verbindung zur Datenbank möglich wäre. Das darf aber nicht sein, da sonst in die Android App Tabellennamen oder Verbindungsinformationen zur DB enthalten würde.

Fragen:
- Datenverkehr sichern mittels SSL/TLS macht keine Performance-Probleme?
- Wie umgehen mit Verbindungsabbrüchen zur Client-App und Client-App versuche, mehrmals gleiche Operation anzufragen? Gefahr der Entstehung eines DDoS!
- Java NIO? Asynchrones Verhalten der Threads liefert Client-Apps nicht sofort Daten?
- Threadlimitierung durch Memory überwachen oder Threadpool?
- Reuse von Objekten speziell Threads?
- Extra Prozesse starten für Abarbeitungs-Threads?
- Kann ich dieses komplette Verbindungs- und Threadmanagement an Vert.x übergeben?
- Was würdet ihr verändern?

Ich bedanke mich.
MfG
 

thecain

Top Contributor
Hast du denn schon ein Problem oder sind das nur gedankenspiele. Ich würde nicht optimieren wo es nichts zu optimieren gibt.

Wenn es dann auftritt siehst du auch wo das Problem tatsächlich liegt
 

Pharadox

Mitglied
Das Problem ist, dass ich nicht weiß, ob dieses Softwaredesign so funktionieren kann oder ob ich nicht eher genau sowas nachbauen würde wie Vert.x bzw. Netty schon ist?
 

Sasuke

Mitglied
Hey,

Frameworks wie Netty nachzubauen ist eine Mamutaufgabe, nichts was man mal eben so nebenbei für ein anderen Projekt macht ;). Ich würde dir empfehlen, die Kommunikation auf etwas REST artiges umzubauen. Mit Mobilgeräten durchgehend Verbindungen offenzuhalten ist immer eine Sache. Zum einen hast du wie du schon erkannt hast das Problem von abbrechenden Verbindungen, zum anderen können andauernde Verbindungen sich natürlich auf die Auslastung und den Stromverbrauch des Gerätes auswirken.

Es lässt sich http://square.github.io/okhttp/ als Client Library empfehlen, die Serverseite überlasse ich dir.

Eine direkte Verbindung zur Datenbank ist natürlich total... uncooler Umgang. Die Datenbank kannst du komplett hinter deinem REST Service verstecken.

Mit freundlichen Grüßen
Sasuke
 

Pharadox

Mitglied
Ich möchte das nicht nachbauen, nur verstehen, ob das, was ich vorhabe, nicht genau das ist, was Netty oder Vert.x quasi sowieso schon im Kern machen?

Also ich benötige keine persistente Verbindung zu Mobilgeräten. Aber die Problematik mit Verbindungsabbruch und erneutem Aufbau sehe ich schon als Last und Gefahr. Aber vllt. bietet auch hierzu Netty/Vert.x bereits integrierte Lösungen. Nur ist es für mich schwer, die genaue Funktionsweise/Umfang in Erfahrung zu bringen.

Wieso auf REST? Wenn die Requests erst über einen HTTP-Server laufen müssen, kostet das doch eher mehr Ressourcen als wenn direkt per Socket!?


Danke für euren Rat!
 

Sasuke

Mitglied
Ich möchte das nicht nachbauen, nur verstehen, ob das, was ich vorhabe, nicht genau das ist, was Netty oder Vert.x quasi sowieso schon im Kern machen?

Also ich benötige keine persistente Verbindung zu Mobilgeräten. Aber die Problematik mit Verbindungsabbruch und erneutem Aufbau sehe ich schon als Last und Gefahr. Aber vllt. bietet auch hierzu Netty/Vert.x bereits integrierte Lösungen. Nur ist es für mich schwer, die genaue Funktionsweise/Umfang in Erfahrung zu bringen.

Wieso auf REST? Wenn die Requests erst über einen HTTP-Server laufen müssen, kostet das doch eher mehr Ressourcen als wenn direkt per Socket!?


Danke für euren Rat!

Hey,

was die im Kern machen ist für viele eine Blackbox. Aber Netty zum Beispiel hat mit dem Aufbau auf NIO eben einen Fokus auf Non Blocking IO und will es vereinfachen, Netzwerkapplikationen mit Fokus auf das Bauen von Implementieren von Protokollen zu entwickeln. Durch hervorragendes Buffer Management kann man einfach sehr viel aus seinem Netzwerk rausholen.

REST empfehle ich dir aufgrund der oben genannten Verbindungsproblematik. Eine "automische Neuverbindung nach Abbruch" hat Netty zwar nicht, die Implementierung wäre jedoch ein Kinderspiel. Welche Funktionsweise und welchen Umfang von was möchtest du denn genau wissen?

Letzendlich sind es alles Bytes, denen ist das Protokoll egal. Über die Performance und die Ressourcen kann man immer streiten, sie sollten jedoch jetzt noch nicht im Fokus stehen. HTTP bietet dir ein vorhandenes etabliertes Protokoll, REST Schnittstellen findest du zuhauf. Alles mit Sockets selber zu entwickeln kann je nach Ziel sehr aufwendig sein. Desweiteren hast du durch REST eine sehr saubere Schnittstelle und kannst Verbindungsprobleme sehr elegant behandeln.

Mit freundlichen Grüßen
Sasuke
 

Pharadox

Mitglied
Einfachstes Beispiel wäre Pokemon Go!
Die haben gewaltige Mengen an Spielern mit Daten zu versorgen. Server die unter Dauerfeuer stehen. Soweit ich weiß hatten sie zu Beginn große Probleme mit ihren Login-Servern.

Was werden die wohl für eine Infrastruktur aufgebaut haben? (Nur von einem einzelnen Server auf einem Kontinent ausgehend.)
 

Sasuke

Mitglied
Einfachstes Beispiel wäre Pokemon Go!
Die haben gewaltige Mengen an Spielern mit Daten zu versorgen. Server die unter Dauerfeuer stehen. Soweit ich weiß hatten sie zu Beginn große Probleme mit ihren Login-Servern.

Was werden die wohl für eine Infrastruktur aufgebaut haben? (Nur von einem einzelnen Server auf einem Kontinent ausgehend.)

Hey,

ich habe mich nie wirklich mit Pokemon GO beschäftigt und die Gründe für Serverprobleme sind manigfaltig. Überlastete Datenbanken, nicht ausreichende Netzwerkanbindung, ausgefallene Server - Alles kann das sein.

Wenn du wissen willst was sie aufgebaut haben fragst du am besten, viele Entwickler geben gerne Auskunft, je nachdem wie komerziell ihr Projekt ist ;) Gängige Praxis für sowas wäre REST.

Mit freundlichen Grüßen
Sasuke
 

JuKu

Top Contributor
Ich kann dir nur vertx.io empfehlen. Ist eine Library, die auf Netty basiert und nochmal mehr weg abstrahiert, was gerade für dich vllt. interessant sein könnte.

Außerdem habe ich mal ein Tutorial geschrieben, wie man einen Chat Server + Client in vertx.io implementiert:

So wie ich das sehe deckt es genau deinen Use Case ab.

Eine Java-Applikation lauscht an einem Port auf eintreffende Verbindungen und delegiert diese an leere Threads oder erstellt pro Verbindung einen neuen.

Für jede Verbindung einen Thread zu erstellen, ist das schlimmste, was du machen kannst. Das wird deinen Computer sehr schnell auslasten. Stattdessen solltest du Thread Pools nutzen, Stichwort Executor Service.

Werden es zuviele Verbindungen (ich rechne vorsorglich mit 1Mio), werden keine neuen Threads mehr erzeugt, um der Gefahr eines Absturzes zu verhindern und die Verbindung landet in einer Warteschlange. (Was schlecht wäre, da die Client-App schon schnell die Information braucht)

1 Mio. Verbindungen? Was willst du denn programmieren?
Wenn du nicht gerade einen Super Computer zu Hause stehen hast, wird dein Computer bei effizienter Software maximal 40.000 Connections schaffen. Das ist eine rein geschätzte Zahl, aber dass du mehr schaffst, glaube ich fast nicht. Wenn du wirklich so viele Verbindungen offen halten müsstest, müsstest du die Server skalieren (Stichwort: scaling out), das wird aber sehr schwierig, wenn du noch nie was mit Networking zu tun hattest.

Ich habe bei Vert.x gesehen, dass es sehr viele Componenten gibt, wodurch auch eine direkte Verbindung zur Datenbank möglich wäre. Das darf aber nicht sein, da sonst in die Android App Tabellennamen oder Verbindungsinformationen zur DB enthalten würde.

Die App darf sowieso keine Daten zur Datenbank besitzen. Braucht sie auch nicht. Sie fragt lediglich das Backend (dein Server) ab und nur dieses greift auf die Datenbank zu.

Fragen:
- Datenverkehr sichern mittels SSL/TLS macht keine Performance-Probleme?

Wenn es Performance-Probleme geben würde, würden dann so viele auf SSL setzen?
SSL zieht kaum Performance, zumindest nicht merklich.

- Wie umgehen mit Verbindungsabbrüchen zur Client-App und Client-App versuche, mehrmals gleiche Operation anzufragen? Gefahr der Entstehung eines DDoS!

Verbindung einfach wieder herstellen, mit einem Delay, z.B. 500ms. Dass ein Computer gleich einen DDOS starten soll (vorallem eine App) wäre nur mit sehr viel Fantasie möglich (meine persönliche Einschätzung).

- Java NIO? Asynchrones Verhalten der Threads liefert Client-Apps nicht sofort Daten?

Was meinst du genau?

- Threadlimitierung durch Memory überwachen oder Threadpool?

Threadpool! Nur einen Thread Pool, keine weiteren Threads erzeugen. Diesen Thread Pool kann man zur Not skalieren, sollte aber eig. nicht notwendig sein.

- Extra Prozesse starten für Abarbeitungs-Threads?

Nein. Prozesse besitzen wesentlich mehr Overhead als Threads. Nur wenn du deinen Computer schnell in die Knie zwingen willst, solltest du neue Prozesse öffnen.

- Kann ich dieses komplette Verbindungs- und Threadmanagement an Vert.x übergeben?

Ja. Definitv!
Solltest du auch bei deinem Vorhaben.
 

JuKu

Top Contributor
Einfachstes Beispiel wäre Pokemon Go!
Die haben gewaltige Mengen an Spielern mit Daten zu versorgen. Server die unter Dauerfeuer stehen. Soweit ich weiß hatten sie zu Beginn große Probleme mit ihren Login-Servern.

Was werden die wohl für eine Infrastruktur aufgebaut haben? (Nur von einem einzelnen Server auf einem Kontinent ausgehend.)

Auch dazu noch was.
Pokemon Go setzt definitv nicht nur einen Server ein, sondern sehr viele. Die skalieren aus. Wäre aber für dich zu kompliziert. Und die nutzen auch vermutlich kein Rest, da Rest zu viel Overhead besitzt, sondern ein Byte Protokoll.
Die Frage ist aber: Was brauchst du?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Viele Clients ein Server Netzwerkprogrammierung 8
B Viele verschiedene E-Mails an unterschiedliche Empfänger schnell versenden? Netzwerkprogrammierung 8
F SSL-Zertifikate für viele Nutzer? Netzwerkprogrammierung 8
R viele HttpRequests - Adapter überlastet? Netzwerkprogrammierung 11
E TCP-Server soll viele offene Verbindungen verwalten Netzwerkprogrammierung 12
M Socket Senden an alle verbundenen Clients Netzwerkprogrammierung 3
M Socket Netzwerk Übertragung zwischen 4 Clients Netzwerkprogrammierung 2
G Gui von 2 Clients Synchronisieren Netzwerkprogrammierung 2
F Schulprojekt erweitern - Online Quiz mit mehreren Clients - Was benötige ich ? Netzwerkprogrammierung 0
Aruetiise Socket Mehrere Clients Netzwerkprogrammierung 4
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
M MultiClient Server - Senden an alle Clients Netzwerkprogrammierung 8
G Multiple Clients and one Server --> java.lang.NullPointerException Netzwerkprogrammierung 1
M Teilnehmerliste vom Server auch an alle Clients senden Netzwerkprogrammierung 0
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6
Z Socket [Chatprogramm] Mehrere Clients an einen Server Netzwerkprogrammierung 10
C Socket Identifikation des clients nach der accept() Methode Netzwerkprogrammierung 2
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
cedi Socket Mehrere Clients an einem Server Netzwerkprogrammierung 4
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
B Socket Liste von clients - multicast Netzwerkprogrammierung 4
M Anzahl Clients aus Start- und Endadr. berechnen Netzwerkprogrammierung 54
borobudur Synchronisation von Clients Netzwerkprogrammierung 10
S Socket nach anderen clients im netzwerk suchen Netzwerkprogrammierung 3
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
L RMI Informationen über die Clients herausfinden Netzwerkprogrammierung 5
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
P Socket Datei von Client zum Server übertragen --> Weiterleitung an Clients Netzwerkprogrammierung 16
F Erhalten und Senden von Nachrichten anhand des Indexes des Clients Netzwerkprogrammierung 19
H Hilfe bei multiplen Clients Netzwerkprogrammierung 7
cowabunga1984 Transferierte Datenmenge eines SOAP Clients (JAX-WS) anzeigen Netzwerkprogrammierung 2
T Administration von Software auf Clients im Netzwerk Netzwerkprogrammierung 6
D Netzwerkprobleme bei mehreren Clients Netzwerkprogrammierung 4
F Peer to Peer Verbindung zwischen mehreren Clients? Netzwerkprogrammierung 8
D Clients sollen mehrere Sessions starten Netzwerkprogrammierung 11
A Server mit mehreren Clients Netzwerkprogrammierung 2
G Nachricht an mehrere Clients schicken Netzwerkprogrammierung 10
5 Webservice max. mit 5 Clients möglich Netzwerkprogrammierung 10
M clients untereinander kommunizieren Netzwerkprogrammierung 2
A RMI: Wieviele Clients können sich gleichzeitig anmelden? Netzwerkprogrammierung 34
B Rmi Kommunikation Server zu mehreren Clients? Netzwerkprogrammierung 3
T Am RMI-Server: IP des Clients ermitteln? Netzwerkprogrammierung 2
J SecurityManager - Server-Zugriff nur von bestimmten Clients? Netzwerkprogrammierung 2
T RMI - Probleme beim Starten des Clients Netzwerkprogrammierung 4
T Chat mit mehreren Clients Netzwerkprogrammierung 3
G Anzahl verbundener Clients zu einem FTP-Server ermitteln? Netzwerkprogrammierung 4
G Server an mehrere Clients Netzwerkprogrammierung 15
D Netzwerk Betrachtung mit vielen Clients Netzwerkprogrammierung 2
G Nachricht von server an alle clients senden Netzwerkprogrammierung 6
I IP Adresse des Clients einer Socket Verbindung Netzwerkprogrammierung 2
S Server mit mehreren Clients Nachrichten austauschen Netzwerkprogrammierung 6
B HTTP HTML-Formular aus Java heraus befüllen und bedienen Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben