Hallo zusammen,
schon wieder eine neue Frage von mir ;D
Ich stelle mir gerade die Frage welche Möglichkeiten und Optionen es gibt seine Architektur für seinen WebSocket Server aufzubauen. In meinem Fall benutze ich die Jakarta EE API und den Tyrus Server zur Erstellung eines WebSocket Server. Ein kurzes Vorwort: Ich arbeite mit Java und WebSocket seit gut 4-5 Tagen, also ist das Gebiet für mich auch völlig neu und weiß auch noch gar nicht was für Möglichkeiten ich habe
Aktuell, so habe ich es bisher gelernt, erstelle ich meine Endpunkte über Annotations.
Erste Frage: Wie gehe ich mit Endpunkten in komplexeren Projekten um? Ist es Best Practice, dass es immer nur den einen Endpunkt gibt und man navigiert anhand des Requests (zB das JSON gibt den Namen des Task wieder und dies wird im Server aufgelöst) zwischen Klassen umher? Oder ist es Best Practice, dass man für verschiedene Aufgaben einen separaten Endpunkt zur Verfügung stellt?
Ein folgendes Beispiel: Ich habe einen Endpunkt /start der dafür sorgt, dass mein Client identifiziert und gespeichert wird. Vielleicht wird sogar auch ein Token erstellt, um den Client zu autorisieren weitere Aufgaben meines Server aufrufen zu können.
Der Endpunkt /start muss in dem Fall immer präsent sein, denn es muss immer eine aktive Verbindung existieren, so dass der Client jedes mal Notification (zB über das Wetter) erhält. Um die weiteren Aufgaben, die der Client vom Server anfragt, zu bearbeiten fallen mir folgende zwei Szenarien ein:
1. Die Verbindung zu /start bleibt bestehen und behält die unique Daten um weitere Anfragen vom Client zu identifizieren. Allerdings beantwortet dieser Endpoint keine weiteren Fragen mehr, sondern dient in dem Fall als Wrapper. Er gibt Client Informationen wieder wie zB Token, UserObject (das man dann über Aufgaben befüllt), uvm. Aufgaben werden, insofern der /start Endpoint besteht, über das aufrufen der jeweiligen Endpoints realisiert und prüfen dann die bestehende Verbindung zum /start Endpoint und identifizieren den Client mithilfe der Informationen die der Wrapper bereitstellt
2. Die Verbindung zu /start bleibt nachwievor bestehen, allerdings sendet der Client immer eine Anfrage an diesen Endpoint und übergibt in seiner Anfrage, um zB. einen Nutzer zu registrieren, ein JSONObject mit den Zugangsdaten und dem Klassennamen die aufgerufen werden muss. Der /start Endpoint wertet die Anfrage aus und arbeitet damit weiter. In dem Fall ruft er die Klasse aus, die dafür zuständig den Nutzer in einer Datenbank einzuspeichern.
Welchen Weg würdet ihr einschlagen und wieso? Welche Wege gibt es noch die ich berücksichtigen sollte? Um Feedback wäre ich sehr dankbar!
Dann noch mal eine allgemeine Frage: Von wo kommt die Session ID die der Server bei einer aktiven Verbindung ausgeben kann? Erstellt der Server eine unique ID für die aktuelle Verbindung oder wird eine Session ID über den TLS-Handshake ausgetauscht? Bei letzterem: wie wird sie erstellt und kann ich damit einen Client pro Endpoint identifizieren? Zum Beispiel habe ich zwei Endpoints: Client 1 verbindet sich mit Endpoint A. Kann ich mittels der SESSION ID jetzt prüfen ob der selbe Client eine Verbindung zu Endpoint B hat?
schon wieder eine neue Frage von mir ;D
Ich stelle mir gerade die Frage welche Möglichkeiten und Optionen es gibt seine Architektur für seinen WebSocket Server aufzubauen. In meinem Fall benutze ich die Jakarta EE API und den Tyrus Server zur Erstellung eines WebSocket Server. Ein kurzes Vorwort: Ich arbeite mit Java und WebSocket seit gut 4-5 Tagen, also ist das Gebiet für mich auch völlig neu und weiß auch noch gar nicht was für Möglichkeiten ich habe
Aktuell, so habe ich es bisher gelernt, erstelle ich meine Endpunkte über Annotations.
Erste Frage: Wie gehe ich mit Endpunkten in komplexeren Projekten um? Ist es Best Practice, dass es immer nur den einen Endpunkt gibt und man navigiert anhand des Requests (zB das JSON gibt den Namen des Task wieder und dies wird im Server aufgelöst) zwischen Klassen umher? Oder ist es Best Practice, dass man für verschiedene Aufgaben einen separaten Endpunkt zur Verfügung stellt?
Ein folgendes Beispiel: Ich habe einen Endpunkt /start der dafür sorgt, dass mein Client identifiziert und gespeichert wird. Vielleicht wird sogar auch ein Token erstellt, um den Client zu autorisieren weitere Aufgaben meines Server aufrufen zu können.
Der Endpunkt /start muss in dem Fall immer präsent sein, denn es muss immer eine aktive Verbindung existieren, so dass der Client jedes mal Notification (zB über das Wetter) erhält. Um die weiteren Aufgaben, die der Client vom Server anfragt, zu bearbeiten fallen mir folgende zwei Szenarien ein:
1. Die Verbindung zu /start bleibt bestehen und behält die unique Daten um weitere Anfragen vom Client zu identifizieren. Allerdings beantwortet dieser Endpoint keine weiteren Fragen mehr, sondern dient in dem Fall als Wrapper. Er gibt Client Informationen wieder wie zB Token, UserObject (das man dann über Aufgaben befüllt), uvm. Aufgaben werden, insofern der /start Endpoint besteht, über das aufrufen der jeweiligen Endpoints realisiert und prüfen dann die bestehende Verbindung zum /start Endpoint und identifizieren den Client mithilfe der Informationen die der Wrapper bereitstellt
2. Die Verbindung zu /start bleibt nachwievor bestehen, allerdings sendet der Client immer eine Anfrage an diesen Endpoint und übergibt in seiner Anfrage, um zB. einen Nutzer zu registrieren, ein JSONObject mit den Zugangsdaten und dem Klassennamen die aufgerufen werden muss. Der /start Endpoint wertet die Anfrage aus und arbeitet damit weiter. In dem Fall ruft er die Klasse aus, die dafür zuständig den Nutzer in einer Datenbank einzuspeichern.
Welchen Weg würdet ihr einschlagen und wieso? Welche Wege gibt es noch die ich berücksichtigen sollte? Um Feedback wäre ich sehr dankbar!
Dann noch mal eine allgemeine Frage: Von wo kommt die Session ID die der Server bei einer aktiven Verbindung ausgeben kann? Erstellt der Server eine unique ID für die aktuelle Verbindung oder wird eine Session ID über den TLS-Handshake ausgetauscht? Bei letzterem: wie wird sie erstellt und kann ich damit einen Client pro Endpoint identifizieren? Zum Beispiel habe ich zwei Endpoints: Client 1 verbindet sich mit Endpoint A. Kann ich mittels der SESSION ID jetzt prüfen ob der selbe Client eine Verbindung zu Endpoint B hat?