2010-12-07 6 views
0

Lassen Sie mich zunächst ein bisschen die aktuelle Architektur beschreiben:Zwei-Phasen-Commit zwischen verschiedenen Technologien (COM +, Java)

Anwendung A ist eine Java-Anwendung in JBOSS ausgeführt und verfügt über eine eigene Datenbank (MSSQL).

Anwendung B ist eine COM + -Anwendung, die auf einer Windows-Maschine ausgeführt wird, die auch von einer eigenen Datenbank (mssql) unterstützt wird.

Für bestimmte geschäftliche Anforderungen muss Anwendung A Anwendung B aufrufen. Zu diesem Zweck wird ein COM-Proxy auf der gleichen Maschine mit Anwendung A (d. H. JBOSS-Maschine) installiert. Eine JNI-Schnittstelle ermöglicht es uns, den Aufruf von Anwendung A -> B zu tätigen.

Dies ist, was wir heute haben und es funktioniert perfekt. Nun ist eine neue Geschäftsanforderung entstanden, und es ist notwendig, eine zweiphasige Festschreibungsfunktion wie folgt zu implementieren:

Eine neue Anwendung C wird erstellt (möglicherweise eine .net-Anwendung), die von unterstützt wird eine eigene Datenbank. Anwendung C ruht auf einem dritten Server (nicht auf unserer Seite).

Anwendung C ruft Anwendung A in einer Transaktion auf. Anwendung A sollte einige Aktionen durchführen, nachdem die integrierte Geschäftslogik berücksichtigt wurde. Zu den Aktionen gehören Schreiben an die Anwendung Eine Datenbank und ein Aufruf an Anwendung B. Anwendung B führt zusätzliche Aktionen aus (zur Anwendung B-Datenbank). Anwendung C aktualisiert ihre Datenbank basierend auf empfangener Rückmeldung. Wenn alle Aktionen erfolgreich sind, werden die Änderungen an die Datenbanken übergeben, andernfalls werden Rollbacks ausgeführt.

Die Frage ist einfach (die Antwort ist komplizierter, denke ich). Ist dies angesichts der unterschiedlichen Technologien, die jede Anwendung unterstützen, machbar? Ich verstehe perfekt, dass wenn alle Anwendungen in .Net oder als COM + -Anwendungen geschrieben wurden, dies machbar ist. Das Ersetzen der Java-Komponenten durch eine andere Technologie ist zu diesem Zeitpunkt keine praktikable Option. Irgendwelche Ideen?

Wir haben JNBridge überprüft, aber ich glaube nicht, dass es bieten kann, was wir wollen. Es wäre in Ordnung, wenn Anwendung C kein Problem wäre.

Alle Ideen/Lösungen sind willkommen. Was sind Ihrer Meinung nach die besten Optionen?

Antwort

2

Könnten Ihre Plattformen eine WS-AtomicTransaction Web Service-Schnittstelle unterstützen? Java/.NET-Interop mit diesem Standard ist mit einigen Produkten der Hersteller möglich. Dies könnte echte 2PC geben.

Allerdings keine Mnatter, wie Sie 2PC tun wird es Leistung und Komplexität Kosten. Sehen Sie sich die Kopplungsimplikationen dieser Architektur genau an: besonders bei der Problemlösung, wenn Fehler auftreten während die 2PC-Auflösungsphase. Sperren können nicht sicher entfernt werden, bis unbestätigte Transaktionen aufgelöst werden. In einigen Fehlerszenarien kann dies eine ziemlich lange Zeitspanne sein.

Sehr oft können Sie ein Problem so umgestalten, dass Sie eigentlich nicht 2PC benötigen - es gibt eine Menge Geschäft ohne 2PC.

+1

Beachten Sie, dass die JBoss-App zwar WS_AT unterstützen könnte, das eigentliche Problem jedoch der Transaktionsfluss von dieser zur COM-Komponente (App A -> App B) wäre. Soweit ich weiß, gibt es keine MS DTC-Unterstützung für MySQL. Das bedeutet, dass die JBoss-App den lokalen Transaktionskontext über einen anderen Transaktionskoordinator erstellen muss, der mit MS DTC kommunizieren kann, und diesen an MySQL weitergeben, damit er sich ebenfalls darin eintragen kann. Das würde die Komplexität erhöhen. Obwohl es durchaus möglich ist, hat JBoss bereits einen Transaktionskoordinator, der mit DTC arbeiten kann. –

+0

danke für die antwort. Es ist mssql auf beiden Seiten. Ich habe die Frage bearbeitet. – yioann

Verwandte Themen