Hallo!
Ich habe eine ganz allgemeine Frage zu der Architektur einer Web-Anwendung.
Wir benötigen einen Webservice der uns umfangreiche Datensätze als XML (nicht SOAP), aber in Zukunft auch als JSON, zurückliefert.
Diese Datensätze werden in einem separaten Schritt über XSL in Webausgaben gerendert.
Derzeit wird das Ganze als sogenanntes "Depot" gelöst:
Dabei wird bei der Initialisierung und in unregelmäßigen (zufallsbasierten) Abständen eine Aktualisierung gestartet, die die gesamten (sinnvollen) Daten unserer zentralen Datenbank in Objekte (im wesentlichen JAXB-basiert) verwandelt und diese Objekte jeweils in eine typisierte Tree/HashMap bzw. ImmutableMap einliest bzw. die vorherige ersetzt.
Bei einer Abfrage an den Webservice (Suche nach Kriterien oder mit ID) erstellen wir basierend auf der - ebenfalls zu einem JAXB-Objekt ge"unmarshallt"en - eigegangenen Request-Message eine JAXB-baierte Response-Message.
Dazu
* liefert die Map das zum Key passende Objekt zurück bzw.
* werden einer "requestlokalen" Liste zunächst entweder
** alle Elemente hinzugefügt und anschließend die, die nicht zu der Abfrage passen, gelöscht oder
** genau andersherum, wird über alle Objekte im Depot iteriert und die Kriterien erfüllenden der lokalen Liste hinzugefügt.
Danach wird die JAXB-basierte Message durch den Marshaller geschickt und als XML-Baum ausgeliefert.
Ich halte dieses Vorgehen in mehrfacher Hinsicht für ineffizient, obwohl die Antwortzeiten recht gut sind.
Aber, dass die Antwortzeiten gut sind, ist auch logisch: es ist schließlich alles im Hauptspeicher des Servers hinterlegt. Dafür haben wir aber auch einen hohen Speicherverbrauch für Objekte, die nie angefragt werden - insgesamt ca 20GB RAM.
Hinzu kommt ein Memory-Leak, dass sich bislang nicht exakt lokalisieren ließ.
Meine Vermutung ist, dass es mit den Depots zusammenhängt, ich kann es aber bislang nicht belegen.
Mein Ansatz wäre eine Lösung in der ich über JPA/EclipseLink die Daten in der Datenbank zu einem Request über ein im Request erzeugtes Abfrage-Objekt suche. Dieses liese sich so weit ich es verstehe nicht nur in EclipseLink, sondern auch in einem Cache - z.B. dem ehcache - hinterlegen.
Welches Vorgehen ist - unabhängig von einer guten Architektur schneller, effizienter? Lohnt es sich, dass ich hier Entwicklungszeit investiere?
Außerdem sind die JAXB-konvertierten Objekte IMHO
* unkomfortabel für die Programmierung
* unkomfortabel für die Navigation im Ergebnisbaum, da nicht bidirektional
* der Status kann nur über die Response- oder Request-Message zwischen den Layern transportiert werden (was das gesamte Depot und die Messages weiter aufbläht)
Hat jemand Erfahrungen mit solchen Konzepten?
Außerdem würde ich gerne eher auf Filter/Interceptor setzen, die den Response "eventgetrieben" modifizieren kann, statt über eine feste Liste von Tasks zu iterieren, die jeweils das komplette Request- und Reponse-Message als Parameter erhalten und dann anpassen.
Habt Ihr allgemeine Einschätzungen, Ideen zu diesem Aufbau?
Welches Framework (Apache CXF, Jaxter, ...) ist leichtgewichtig, gut zu lernen, usw. - kurz aus Erfahrung empfehlenswert?
Die Struktur möchte der Kollege weiter ausbauen und immer mehr Inhalte in diese Depots packen.
Bislang habe ich nur ein Gefühl, dass das nicht sinnvoll ist. Sollte ich meine Idee ausprobieren?
Danke vielmals,
Juan
Wir verwenden: Oracle 12c, Tomcat 7, Java 7
Ich habe eine ganz allgemeine Frage zu der Architektur einer Web-Anwendung.
Wir benötigen einen Webservice der uns umfangreiche Datensätze als XML (nicht SOAP), aber in Zukunft auch als JSON, zurückliefert.
Diese Datensätze werden in einem separaten Schritt über XSL in Webausgaben gerendert.
Derzeit wird das Ganze als sogenanntes "Depot" gelöst:
Dabei wird bei der Initialisierung und in unregelmäßigen (zufallsbasierten) Abständen eine Aktualisierung gestartet, die die gesamten (sinnvollen) Daten unserer zentralen Datenbank in Objekte (im wesentlichen JAXB-basiert) verwandelt und diese Objekte jeweils in eine typisierte Tree/HashMap bzw. ImmutableMap einliest bzw. die vorherige ersetzt.
Bei einer Abfrage an den Webservice (Suche nach Kriterien oder mit ID) erstellen wir basierend auf der - ebenfalls zu einem JAXB-Objekt ge"unmarshallt"en - eigegangenen Request-Message eine JAXB-baierte Response-Message.
Dazu
* liefert die Map das zum Key passende Objekt zurück bzw.
* werden einer "requestlokalen" Liste zunächst entweder
** alle Elemente hinzugefügt und anschließend die, die nicht zu der Abfrage passen, gelöscht oder
** genau andersherum, wird über alle Objekte im Depot iteriert und die Kriterien erfüllenden der lokalen Liste hinzugefügt.
Danach wird die JAXB-basierte Message durch den Marshaller geschickt und als XML-Baum ausgeliefert.
Ich halte dieses Vorgehen in mehrfacher Hinsicht für ineffizient, obwohl die Antwortzeiten recht gut sind.
Aber, dass die Antwortzeiten gut sind, ist auch logisch: es ist schließlich alles im Hauptspeicher des Servers hinterlegt. Dafür haben wir aber auch einen hohen Speicherverbrauch für Objekte, die nie angefragt werden - insgesamt ca 20GB RAM.
Hinzu kommt ein Memory-Leak, dass sich bislang nicht exakt lokalisieren ließ.
Meine Vermutung ist, dass es mit den Depots zusammenhängt, ich kann es aber bislang nicht belegen.
Mein Ansatz wäre eine Lösung in der ich über JPA/EclipseLink die Daten in der Datenbank zu einem Request über ein im Request erzeugtes Abfrage-Objekt suche. Dieses liese sich so weit ich es verstehe nicht nur in EclipseLink, sondern auch in einem Cache - z.B. dem ehcache - hinterlegen.
Welches Vorgehen ist - unabhängig von einer guten Architektur schneller, effizienter? Lohnt es sich, dass ich hier Entwicklungszeit investiere?
Außerdem sind die JAXB-konvertierten Objekte IMHO
* unkomfortabel für die Programmierung
* unkomfortabel für die Navigation im Ergebnisbaum, da nicht bidirektional
* der Status kann nur über die Response- oder Request-Message zwischen den Layern transportiert werden (was das gesamte Depot und die Messages weiter aufbläht)
Hat jemand Erfahrungen mit solchen Konzepten?
Außerdem würde ich gerne eher auf Filter/Interceptor setzen, die den Response "eventgetrieben" modifizieren kann, statt über eine feste Liste von Tasks zu iterieren, die jeweils das komplette Request- und Reponse-Message als Parameter erhalten und dann anpassen.
Habt Ihr allgemeine Einschätzungen, Ideen zu diesem Aufbau?
Welches Framework (Apache CXF, Jaxter, ...) ist leichtgewichtig, gut zu lernen, usw. - kurz aus Erfahrung empfehlenswert?
Die Struktur möchte der Kollege weiter ausbauen und immer mehr Inhalte in diese Depots packen.
Bislang habe ich nur ein Gefühl, dass das nicht sinnvoll ist. Sollte ich meine Idee ausprobieren?
Danke vielmals,
Juan
Wir verwenden: Oracle 12c, Tomcat 7, Java 7
Zuletzt bearbeitet: