JEE - MessageDrivenBean und mehrere Server

LimDul

Top Contributor
Folgendes Szenario:

* Eine MessageQueue (MQSeries auf dem Host um genau zu sein)
* Zwei identisch deployte JBoss Server mit einer EE-Anwendung (Werden über Loadbalancer angesteuert beim Web-Zugriff)
* Die Anwendung hat eine MessageDrivenBean, die auf ein Topic hört und alles was da rein kommt verarbeitet (Datenänderung wird vorgenommen)

Problem: Kommt eine Nachricht, verarbeiten beide Server diese Nachricht und die Datenänderung wird 2x vorgenommen. Das ist extrem unschön.

Was für - simple - Möglichkeiten fallen euch ein um die doppelte Verarbeitung zu unterbinden unter der Annahme:
* An der Queue bzw. dem Topic kann man nix ändern
* Es gibt keine Möglichkeit sicherzustellen, dass die Nachricht nur von einem der beiden Server abgeholt wird

Klar ist, man kann bevor man die Datenänderung durchführt, prüfen ob sie überhaupt notwendig ist und ansonsten verwerfen. Aber das klappt natürlich nur wenn nicht beide Server zeitgleich anfangen die Nachricht zu verarbeiten. Hab ich irgendeine sinnvolle Chance ohne größere Performance-Einbuße eine Synchronisierung/Semaphore Server-übergreifend hinzubekommen? (Praktisch befürchte ich zwar, das uns für alle größeren Änderungen die Zeit fehlt, aber ich bin mal neugierig was es für Möglichkeiten gibt ohne großen Overhead)
 

mihe7

Top Contributor
Es gibt keine Möglichkeit sicherzustellen, dass die Nachricht nur von einem der beiden Server abgeholt wird
All problems in computer science can be solved by another level of indirection...

Spontan würde ich an eine Art JMS-Proxy denken, der stellvertretend für Deinen Cluster auf das Topic lauscht und den Spaß dann in eine Queue für Deine MDBs steckt (wenn ich es richtig sehe, macht ApacheMQ sowas in der Richtung mit Virtual Topics).

Wie auch bei den anderen Ansätzen wird aber auch hier das CAP-Theorem dazwischenfunken. Fällt der Proxy aus...

Kurz: Konsistenz oder Verfügbarkeit, such Dir was aus :)
 

LimDul

Top Contributor
All problems in computer science can be solved by another level of indirection...

Spontan würde ich an eine Art JMS-Proxy denken, der stellvertretend für Deinen Cluster auf das Topic lauscht und den Spaß dann in eine Queue für Deine MDBs steckt (wenn ich es richtig sehe, macht ApacheMQ sowas in der Richtung mit Virtual Topics).

Wie auch bei den anderen Ansätzen wird aber auch hier das CAP-Theorem dazwischenfunken. Fällt der Proxy aus...

Kurz: Konsistenz oder Verfügbarkeit, such Dir was aus :)
Ja, im Kopf hatte ich die auch - fällt aber aus aufgrund von Aufwand + Verfügbarkeit. Wir haben zum aktuellen Zeitpunkt nur die Chance in der Anwendung selber was zu ändern. Weitere Anwendungen, Proxys oder Infrastruktur ist leider utopisch.

(Kurzer Hintergrund - wie sind gerade im Abnahmetest und beim Deployment auf die Vorproduktion, wo das erste mal ein Loadbalancer da ist, ist das Problem aufgetreten)
 

mihe7

Top Contributor
Ja, im Kopf hatte ich die auch - fällt aber aus aufgrund von Aufwand + Verfügbarkeit. Wir haben zum aktuellen Zeitpunkt nur die Chance in der Anwendung selber was zu ändern. Weitere Anwendungen, Proxys oder Infrastruktur ist leider utopisch.

(Kurzer Hintergrund - wie sind gerade im Abnahmetest und beim Deployment auf die Vorproduktion, wo das erste mal ein Loadbalancer da ist, ist das Problem aufgetreten)
Kommt mir irgendwie bekannt vor - sobald Parallelität/Verteilung Einzug hält, treten sonderbare Dinge auf :)

Du könntest ja z. B. dafür sorgen, dass immer die gleiche Instanz den Spaß verarbeitet (z. B. per Config). Was aber passiert, wenn die nicht erreichbar ist? Daran ändert sich auch nix, wenn die Instanzen sich bei der Verarbeitung abwechseln.

Synchronisierung: könnte man über ein DB-Tabelle machen oder mit ehcache sollte das auch funktionieren.
 

LimDul

Top Contributor
ehcache klingt durchaus interessant. Da schau ich mal, wenn ich Zeit finde, rein.

In der Praxis wird es vermutlich eh auf die minimal-Lösung rauslaufen: Vor Start schauen ob noch notwendig => Wenn ja, verarbeiten. Und wenn es halt doppelt verarbeitet wurde, steht halt 2x das was an den Daten was geändert wurde innerhalb einer Sekunde. Ist nicht schön, aber fachlich kein Problem.

(Oder IBM findet noch eine Lösung, wie das geht, dass man eine shared Subscription hinbekommt)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
LesterBurnham Spring, Config Server, mehrere Gitlab Repos für Konfiguration - best practices Frameworks - Spring, Play, Blade, Vaadin & Co 1
Avalon Mehrere Methoden in einer Klasse testen Frameworks - Spring, Play, Blade, Vaadin & Co 21
L JavaFX Anwendung mit Spring Boot und mehrere FXML Forms Frameworks - Spring, Play, Blade, Vaadin & Co 5
N Wie manage ich unter Spring mehrere Datenbankverbindung mit Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 6
Dimax Spring App Probleme beim Ausführen auf dem Tomcat Server Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 eureka server in Gradle Projekt kann Methoden nicht finden Frameworks - Spring, Play, Blade, Vaadin & Co 5
Robertop Springboot Server kann Jakarta Persistence Root nicht installieren? Frameworks - Spring, Play, Blade, Vaadin & Co 0
Christopher865 Netflix Eureka: Zwei Server - Einer stürtzt ab Frameworks - Spring, Play, Blade, Vaadin & Co 6
Zrebna Vaadin mit Jetty Server -> ERROR: Jetty server existing Frameworks - Spring, Play, Blade, Vaadin & Co 2
Zrebna Erste Steps mit Vaadin - via HotSwapAgent nach Code-Änderungen, Server-Restart vermeiden Frameworks - Spring, Play, Blade, Vaadin & Co 0
sascha-sphw Spring Boot Resource Server (OAuth2) @MockMvc Frameworks - Spring, Play, Blade, Vaadin & Co 5
L Rest Server über Jersey Low Code starten Frameworks - Spring, Play, Blade, Vaadin & Co 7
F Server-Java-Spring Websockets Frameworks - Spring, Play, Blade, Vaadin & Co 6
D Spring Boot auf virtuellen Server oder Cloud? Frameworks - Spring, Play, Blade, Vaadin & Co 4
D AWS Server Spring Boot und Datenbank Frameworks - Spring, Play, Blade, Vaadin & Co 0
B Spring Boot/Html-Content/Web-Server Frameworks - Spring, Play, Blade, Vaadin & Co 2
A Spring Server Logging Frameworks - Spring, Play, Blade, Vaadin & Co 5

Ähnliche Java Themen

Neue Themen


Oben