Ich habe an der Lösung für die Finanzindustrie gearbeitet. Die Hauptfunktionalität der Anwendung ist die Fähigkeit, massive Eingabedateien zu laden, sie zu verdauen, den Status im persistenten Speicher zu aktualisieren und auf Anforderung Extrakte aus dem persistenten Speicher zu generieren. Ziemlich einfach.Skalierbarkeit der Java EE-Anwendung. Wie würdest du es angehen?
Die Eingabedateien sind Industriestandard formatierte XML große (mehr als Hunderte von Megabyte) Nachrichten, die viele wiederholte Einträge enthalten. Der persistente Speicher ist eine relationale Datenbank. Die Engine wurde als POJO-basierte (Spring Framework als Back-Bone) Java-Anwendung implementiert, die auf dem J2EE-Anwendungsserver implementiert werden kann.
Die Frage ist die Skalierbarkeit und Leistung der Lösung. Wenn die Anwendung sequenziell Einträge aus XML verarbeitet, ist die Skalierbarkeit der Lösung eher gering. Es gibt keine Möglichkeit, mehr als eine Instanz der Anwendung in die Verarbeitung der einzelnen Datei einzubeziehen. Aus diesem Grund habe ich die parallele Verarbeitung für Eingaben in die XML-Eingabedatei eingeführt. Grundsätzlich besteht die Idee darin, die Verarbeitung einzelner Einträge für Arbeiter aus dem Pool zu versenden. Ich entschied mich, JMS für das Dispatching zu verwenden. Die Komponente, die die Datei lädt, liest den Stream und extrahiert einfach einzelne Einträge und füttert die Dispatch-Warteschlange. Am anderen Ende der Warteschlange befindet sich eine Anzahl gleichzeitiger Benutzer. Jeder wählt eine Nachricht der Warteschlange aus und verarbeitet den Eintrag und ist sofort verfügbar, um einen anderen Eintrag zu verarbeiten. Dies ist den Servlets innerhalb des Webcontainers ziemlich ähnlich. Was mir an diesem Ansatz besonders gelungen ist, ist, dass die Worker in separaten Instanzen der auf Remote-Servern bereitgestellten Anwendung residieren können, solange die Warteschlange freigegeben ist. Leider verbinden sich alle Mitarbeiter mit der gleichen Datenbank, die Persistenzspeicher verwaltet, und dies kann ein Flaschenhals sein, wenn der Datenbankserver nicht leistungsfähig genug ist, um die Last von konkurrierenden Arbeitern zu verarbeiten.
Was ist Ihre Meinung zu dieser Architektur? Hatten Sie eine ähnliche Anwendung für das Design? Was war deine Designentscheidung?
In einem mehrstufigen System, das Sie vorschlagen, muss Pregst vorsichtig sein, wenn es um Transaktionsintegrität geht - wenn beispielsweise die Warteschlange der Maschine abstürzt, [s] kann er Daten verlieren. JMS enthält Transaktions-Awareness, aber die Leistungsmerkmale davon sind implementierungsabhängig. – joev
Tatsächlich verwende ich XA-glabal-Transaktionen, die sich über JMS-Sitzung und JDBC-Verbindung erstrecken. Also, alles ist transaktional. Außerdem werden JMS-Nachrichten als persistent markiert.Damit kann ich einmal und nur einmal Liefermerkmale annehmen. –
Sie können auch ein Tool wie Terracotta verwenden, das den Status Ihrer JVM-Heaps transparent auf der Festplatte widerspiegelt und nach Systemabstürzen wiederherstellt. –