Wie können Sie Webservices in einer Unternehmensumgebung effektiv nutzen, wenn Sie keine Transaktionen verwenden können?

14

Der Ort, an dem ich arbeite, versucht, einige Grundregeln zu etablieren, und die Debatte, die wir derzeit führen, sind lokale Bibliotheken und Webservices zur Wiederverwendung von Code. Web-Services scheinen in den meisten Unternehmen die beliebteste Wahl zu sein, und genau darauf tendieren die meisten Entwickler hier.

Ich kann einfach nicht erkennen, wie Sie Webdienste für eine ernsthafte Arbeit effektiv nutzen können. Wie kann ich mehrere Serviceabrufe sicher ausführen, wenn ich keine Transaktion verwenden kann?

Angenommen, ich habe einen Cron-Job, der Kunden aus unserer Datenbank abruft, die eine bestimmte Bedingung erfüllen, über die sie benachrichtigt werden müssen. Sie erhalten ein Fax, eine E-Mail und ein Ticket, um das Problem intern zu verfolgen. Das sind 3 verschiedene Serviceaufrufe, die für jeden Kunden in einer for-Schleife stattfinden würden.

Wenn dort irgendwo ein Fehler auftritt, wird möglicherweise ein Fax und eine E-Mail an den Kunden gesendet, aber kein Ticket erstellt. Oder schlimmer noch, dieser Cron-Job kann einen Fehler enthalten, der dazu führt, dass er jedes Mal zum gleichen Zeitpunkt fehlschlägt und denselben Kunden wiederholt per E-Mail benachrichtigt. Wenn die Bibliotheken alle lokal wären, könnte alles einfach in eine Transaktion eingebunden werden, und all das würde nicht passieren. In diesem Beispiel verwenden wir jedoch Webdienste.

Beachten Sie, dass die E-Mail- und Faxmethoden die Daten tatsächlich in datenbankgestützte Warteschlangentabellen einfügen, die wiederum von einem separaten Cron-Job-Prozess verarbeitet werden. So können die Aufrufe der Dienstmethoden "E-Mail senden" und "Fax senden" bei Bedarf nebenwirkungsfrei abgebrochen werden.

Eine Option besteht darin, diesen gesamten Codebaustein in den Webdienst selbst einzufügen, sodass der Webdienst selbst die Methoden zum Erstellen von E-Mails, Faxen und Tickets in einer Transaktion aufruft. Aber dann erstellen wir eine Webservice-Methode nur für die Verwendung einer Transaktion. Es gibt keinen gültigen Grund, warum wir diese Methode jemals von irgendwo anders als in diesem einen Cron-Skript aufrufen müssten.

Wie würden Sie generell mit dieser Methode umgehen?

Ryeguy
quelle
Für eine vollständige Antwort benötige ich weitere Informationen. Beim Übergang zu einer service-basierten Architektur sind viele Dinge zu beachten. Haben Sie beispielsweise eine heterogene Umgebung (verschiedene Sprachen und Plattformen) oder eine homogene Umgebung (eine einzige Sprache und Plattform)? Haben Sie ein Servicebussystem? Wenn nicht, planen Sie eine Implementierung? Wie wollen Sie auf Ihre Dienste zugreifen (Intranet mit einem Standort, WAN mit mehreren Standorten, verteilter Client, der eine API für öffentliche Dienste erreicht)? Es gibt eine Reihe von Variablen, die sich auf eine "optimale" Lösung auswirken.
Michael Brown
@MikeBrown: Die Dienste würden alle in einer Sprache geschrieben, aber von mehreren Plattformen genutzt. Keine Ahnung von der Implementierung eines EBS, wir haben noch nicht einmal mit irgendwelchen Servicearbeiten begonnen, also ist alles möglich. Die Dienste würden größtenteils intern über unser lokales Netzwerk konsumiert, es müssten jedoch einige öffentlich zugängliche Dienste für mobile Anwendungen bereitgestellt werden.
Ryeguy
"Wenn die Bibliotheken alle lokal wären, könnte alles einfach in eine Transaktion eingebunden werden, und nichts davon würde passieren." Falsch. Der Fehler kann auftreten, nachdem die E-Mail gesendet wurde, aber bevor die endgültige Datenbankaktualisierung durchgeführt wurde. Eine Transaktion verhindert nicht rückwirkend die E-Mail oder das Fax.
S.Lott
@S.Lott: Es würde, weil die Email- und Faxdienstanrufe eigentlich nur diese in eine Warteschlange einfügen, die von einem anderen Prozess zugestellt werden. Wenn die oben beschriebene Transaktion stattfinden würde, würde das Einfügen der Warteschlange abgebrochen.
Ryeguy
1
@ryeguy: Bitte aktualisieren Sie die Frage. Bitte fügen Sie der Frage keine Kommentare hinzu. Dies ist ein wichtiger Teil Ihrer Architektur. Bitte geben Sie dies in der Frage an.
S.Lott

Antworten:

5

Was Sie beschreiben, ist eine verteilte Transaktion , die ein zweiphasiges Commit implementiert . Einige Messaging-Plattformen für Unternehmen umfassen Transaktionsmanager, die solche Funktionen unterstützen. Konkrete Produkte sind jedoch plattform- / sprachabhängig. Ich habe keine konkreten Erfahrungen mit solchen Tools, hoffe aber, dass diese Hinweise helfen.

Péter Török
quelle
3

Es ist interessant, dass die DDD / CQRS-Mailingliste, an der ich teilnehme, einen ähnlichen Thread zu Diensten enthält, die mehrere Plattformen unterstützen. Ich kann hier einige meiner Ratschläge wiederholen.

Eine Option für die Unterstützung von Transaktionen in einer heterogenen Umgebung ist die Verwendung eines Transportmechanismus, der Transaktionen unterstützt und auf allen Plattformen unterstützt wird, auf denen er verwendet wird. Das Advanced Message Queue Protocol (AMQP) unterstützt Transaktionen und es gibt eine native API für fast jede Sprache, die heute allgemein verwendet wird. RabbitMQ ist ein Server, der AMQP implementiert und in der Branche als robuste Lösung geprüft wurde.

Wenn Sie ein RabbitMQ-basiertes System einsetzen, sind Sie auf dem Weg zu einem vollständigen ESB, falls Sie daran wachsen müssen. Sie veröffentlichen Nachrichten in einem Kanal und abonnieren eine Warteschlange. Was wirklich mächtig wird, ist, dass Sie zwischen dem Kanal und der Warteschlange viele interessante Dinge ausführen können. Ein Kanal kann mehrere Warteschlangen (Pub / Sub) versorgen. Eine Warteschlange kann von mehreren Kanälen gespeist werden. Sie können Nachrichten an verschiedene Warteschlangen weiterleiten, basierend auf dem Inhalt usw. usw.

Ich habe gerade über Alternativen zu Transaktionen gelesen (die mit Overhead verbunden sind und eine asynchrone Operation in eine blockierende Operation verwandeln). RabbitMQ unterstützt sogenannte Publisher Confirms . Grundsätzlich können Sie einen Rückruf für eine veröffentlichte Methode registrieren, um eine fehlgeschlagene Transaktion zu verarbeiten. In Ihrem Fall könnten die E-Mail- / Faxanfragen rückgängig gemacht und das Ticket gelöscht werden.

Natürlich geht das Kaninchenloch (verzeihen Sie das Wortspiel) von dort aus noch tiefer. Mit Rabbit können Sie komplexe Orchestrierungen mit internen und externen Webdiensten durchführen.

Für Ihre öffentlich zugänglichen Webservices ist dies denkbar einfach. Ihr Service (sei es SOAP, REST oder JSON) veröffentlicht lediglich eine Nachricht an die entsprechende Servicewarteschlange und lässt sie von dort aus von Ihrem internen System verarbeiten.

Es gibt auch Funktionen zum Erstellen einer Anforderungs- / Antwortnachricht für die Szenarien, in denen Sie Informationen schnell wieder erwarten.

Michael Brown
quelle
2

Die Schlüsselwörter, nach denen Sie suchen, sind "Webservice-Choreografie".

Lesen Sie den Wikipedia -Artikel darüber.

Dibbeke
quelle
Manchmal auch "Orchestrierung" genannt.
S.Lott
1

Die Art und Weise, wie ich dies in einer von mir geschriebenen Service-App handhabte, bestand darin, einen Wrapper für die erforderlichen Transaktionen zu erstellen. In meinem Fall musste die Benutzeranforderung, die von einer Website, einer Desktop-App oder einem Windows-Dienst gestellt wurde, einen Webdienst abfragen und basierend auf dem Ergebnis und den Benutzeroptionen eine lokale Datenbank und optional eine entfernte Datenbank aktualisieren über einen Webservice. Anschließend musste ein Bericht erstellt werden, der sofort per E-Mail und / oder Fax zurückgesandt werden konnte. Ich hatte die Kontrolle über die lokale Datenbank-, E-Mail- und Berichterstellung, jedoch keine über die Webservices oder den Faxserver.

Das Erstellen eines Wrappers ermöglichte eine bessere Transaktionskontrolle und Fehlerbehandlung. Es ermöglichte auch eine bessere Sicherheit, indem der Zugriff auf interne Netzwerkdienste von externen Quellen gesteuert wurde. Im Allgemeinen sehe ich die Notwendigkeit von Transaktionen und die Verwaltung des Dienstes als gültigen Grund, einen geeigneten Wrapper für eine einzelne Lösung zu erstellen, solange der Code ordnungsgemäß wiederverwendet wird (keine Codierung durch Ausschneiden und Einfügen).

jfrankcarr
quelle
1

Ich kann einfach nicht erkennen, wie Sie Webdienste für eine ernsthafte Arbeit effektiv nutzen können. Wie kann ich mehrere Serviceabrufe sicher ausführen, wenn ich keine Transaktion verwenden kann?

Das kannst du nicht.

Die Frage, die Sie sich stellen sollten, lautet: Wie implementiere ich Transaktionen mit dem Web-Service-Framework X? Im Moment nehmen Sie nur an, dass es unmöglich ist.

Mike Baranczak
quelle