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?
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
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?

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