2009-03-13 7 views
2

Grundlegende Architektur: n physische Boxen, die jeweils den gleichen WCF-Dienst hosten, einen Lastenausgleich starten. Jede Box eine einzelne Datenbank-Infrastruktur treffen, die nicht Unterstützung Transaktionen - fragen Sie nicht :(Verteilte Transaktionen mit WCF

Also, in der Datenzugriffsschicht meiner app ich eine Methode der verteilten Transaktionen benötigen Was sind meine Optionen

.?

Beachten Sie, dass Kunden zu meinem System Vermächtnis sein werden apps mit grundlegendem Web-Service (Basichttpbinding) und glänzende neue WCF-Clients (NetTcpBinding oder NetNamedPipeBinding) in Verbindung steht.


Edit 1

z. es wird einen einzelnen Anruf in die WCF-Schicht in der physischen Box 1 geben, z. EditEntity (...). Dieser Aufruf löst 2 Schreibvorgänge in der Datenbank aus. Nach dem ersten Schreibvorgang ruft ein anderer Client EditEntity (...) für dieselbe Entität in einer zweiten Instanz meines WCF-Dienstes in einer zweiten physischen Box auf. Woher weiß ich auf der zweiten Box, dass eine Transaktion für diese bestimmte Entität bereits im Spiel ist?

Danke.

Antwort

2

Nicht sicher, dass Sie uns genug gegeben haben, um weiterzumachen, aber wenn ich richtig lese, versuchen Sie sicherzustellen, dass Sie eine Transaktion über Ihren WCF-Dienst unterstützen können? Während Ihre Datenbank keine Transaktionen unterstützt und Ihre WCF-Endpunkte sich hinter einem Lastenausgleich befinden? Habe ich das richtig? Wenn ja ...

Da Ihre DB keine Transaktionsunterstützung hat, wird diese auf Ihre WCF-Ebene verschoben. Dies deutet auf eine grobe Granularität in Ihren Methoden hin, sodass Sie sicherstellen können, dass ein einzelner Aufruf für Ihren WCF-Service Ihre Transaktion ausreichend umfasst. Verbreiten Sie eine Transaktion nicht über mehrere WCF-Aufrufe hinweg, sondern um Probleme.


UPDATE: Es gibt Strategien, die mit Loadbalancer, die Persistenz unter Verbindungen gewährleisten eingesetzt werden können, aber das wird man hier nicht helfen. Wenn Sie EditEntity() fortlaufend aufrufen und der erste Eintrag eine Transaktion initiieren soll und der zweite Eintrag eine Transaktion abschließen soll, ist Ihr Service nicht granular genug.

Konsolidieren Sie diese beiden Aufrufe zu einer Methode, d. H. EditEntityComplete().

Gibt es einen Grund, dass Sie keine Methode erstellen können, im Gegensatz zu zwei?


UPDATE # 2: Umformulierung der Frage - eine einzige Methode führt Einträge in einer Datenbank, die keine Transaktionen unterstützen. Die betreffende Methode führt eine Reihe von Schritten aus, die der Reihe nach ausgeführt werden müssen. Die WCF-Methode stellt Opportunities für Concurrency-Contention dar, um die Schrittvervollständigung in der richtigen Reihenfolge zu verletzen.

Wenn Sie davon ausgehen, dass Sie keine Rückgabedaten von der Funktion benötigen, sollten Sie eine asynchrone Warteschlange in Erwägung ziehen, die Anforderungen von den WCF-Endpunkten protokollieren kann. Verarbeiten Sie dann die Warteschlange von einem einzelnen Hintergrundprozess.


FINAL REVISION:

Reconsider die Anforderung nicht auf den Datenspeicher zu ändern.

Angesichts der Anforderungen für mehrere Clients, Notwendigkeit für die Skalierung, Lastverteilung und transaktionale Unterstützung im Datenspeicher, ein letzter Vorschlag - drücken, um die Datenbank zu ändern. Dies zu verstehen, ist eine statische Anforderung, aber Sie werden viel Mühe darauf verwenden, Transaktionsunterstützung zu implementieren, wenn viele einfache Datenbankplattformen diese für Sie bereitstellen. Der Versuch, diese Funktionalität neu zu erstellen, hat wenig, aber eine Menge Nachteile.

+0

Danke. Ihre Zusammenfassung ist korrekt. Problem ist, dass die WCF-Schicht auf mehrere Boxen verteilt wird - d. H. Skaliert. Ich habe meine Frage aktualisiert. – ng5000

+0

Es gibt nur eine Methode. Es wird jedoch von zwei verschiedenen Clients aufgerufen, und jede Anforderung wird von einer anderen physischen Box bedient. – ng5000

+0

OK, ich glaube, ich verstehe jetzt besser. Es klang, als ob zwei aufeinander folgende Aufrufe von EditEntity() erforderlich wären, um eine Transaktion abzuschließen. – jro